I'm using SQLite-net (https://github.com/praeclarum/sqlite-net) for implementing a database using Mono on Android and have the following:
public class DatabaseTestASync
{
private SQLiteAsyncConnection m_db;
public delegate void StocksFound(List<Stock> list);
public event StocksFound StocksFoundListener;
// Uninteresting parts remove, e.g. constructor
public void AddStock(Stock stock)
{
m_db.InsertAsync(stock).ContinueWith(t => { Debug.WriteLine(stock.Symbol + " added"); });
}
public void GetAllStocks()
{
AsyncTableQuery<Stock> query = m_db.Table<Stock>().Where(stock => true);
query.ToListAsync().ContinueWith(QueryReturns);
}
private void QueryReturns(Task<List<Stock>> t)
{
if (StocksFoundListener != null)
StocksFoundListener(t.Result);
}
This is great for giving me a list of stocks, but I envisage having a collection of tables in my project and don't want to create a separate AddX, GetAllX, QueryReturns(X), etc. for each table. I'm after a generic way of doing these database operations and tried the following:
public class DBQuery<T>
{
private SQLiteAsyncConnection m_db;
public delegate void OnRecordsFound(List<T> list);
public event OnRecordsFound RecordsFoundListener;
public DBQuery (SQLiteAsyncConnection db)
{
m_db = db;
}
public void GetAllRecords()
{
AsyncTableQuery<T> query = m_db.Table<T>().Where(r => true); // COMPILE ERROR HERE
query.ToListAsync().ContinueWith(QueryReturns);
}
private void QueryReturns(Task<List<T>> t)
{
if (RecordsFoundListener != null)
RecordsFoundListener(t.Result);
}
}
However, it doesn't compile saying: 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'DatabaseUtility.AsyncTableQuery'.
Any ideas about how I can get this kind of generic database access working?
I don't really know the SQLite internals, but this is strictly about generics
...
Since AsyncTableQuery
is defined like this
public class AsyncTableQuery<T>
where T : new ()
{
...or just based on your error, you need to put the same constraint on your T
:
public class DBQuery<T> where T : new ()
If you're using a class or a method which has a
constrained generic parameter
- you need to do the same on your method (or a class, depending on where theT
is defined).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With