2013-04-24 28 views
5

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?

Odpowiedz

5

ja naprawdę nie wiem, SQLite wewnętrzne, ale jest to absolutnie o generics ...

Od AsyncTableQuery jest zdefiniowany jak ten

public class AsyncTableQuery<T> 
     where T : new() 
    { 

... lub po prostu opiera się na błędzie trzeba umieścić ten sam ograniczenie na T:

public class DBQuery<T> where T : new() 

Jeśli używasz klasy lub metody z constrained generic parameter - musisz zrobić to samo w swojej metodzie (lub klasie, w zależności od tego, gdzie zdefiniowano T).

+0

Genialny, działa idealnie. Dzięki. –

Powiązane problemy