Używam SQLite-net (https://github.com/praeclarum/sqlite-net) za wdrożenie bazy danych za pomocą Mono na Androida i mają następujące:Tworzenie zapytań generycznych w SQLite-net C# za pomocą SQLiteAsyncConnection
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);
}
To jest dobre dla dając mi lista zasobów, ale wyobrażam sobie posiadanie zestawu tabel w moim projekcie i nie chcę tworzyć osobnych AddX, GetAllX, QueryReturns (X) itd. dla każdej tabeli. Jestem po ogólny sposób prowadzenia tych operacji bazodanowych i próbował następujący:
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);
}
}
Jednak to nie skompilować mówiąc: „T” musi być non-abstrakcyjny typ z konstruktora bez parametrów publicznego w celu używać go jako parametru "T" w typie ogólnym lub metodzie "DatabaseUtility.AsyncTableQuery".
Jakieś pomysły na temat tego, jak uzyskać dostęp do tego rodzaju ogólnego dostępu do bazy danych?
Genialny, działa idealnie. Dzięki. –