2013-04-24 3 views
5

Ich verwende SQLite-net (https://github.com/praeclarum/sqlite-net) für eine Datenbank mit Mono auf Android Implementierung und haben die folgenden:generische Abfragen in SQLite-net C# Erstellen SQLiteAsyncConnection mit

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); 
    } 

Diese für die mir groß ist ein Liste von Aktien, aber ich stelle mir vor, eine Sammlung von Tabellen in meinem Projekt zu haben und nicht für jede Tabelle ein separates AddX, GetAllX, QueryReturns (X) usw. zu erstellen. Ich bin nach einer generischen Art und Weise, diese Datenbankoperationen zu tun und versucht, die folgenden:

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); 
    } 
} 

Aber es lässt sich nicht kompilieren zu sagen: ‚T‘ eine nicht-abstrakten Typ mit einem öffentlichen parameterlosen Konstruktor sein muss, um um es als Parameter 'T' im generischen Typ oder in der Methode 'DatabaseUtility.AsyncTableQuery' zu verwenden.

Irgendwelche Ideen, wie ich diese Art von generischem Datenbankzugriff zum Laufen bringen kann?

Antwort

5

Ich weiß nicht wirklich die SQLite-Interna, aber das ist streng über generics ...

Seit AsyncTableQuery wie diese

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

definiert ist ... oder einfach nur auf der Grundlage Ihres Fehler, Sie müssen die gleiche Einschränkung auf T setzen:

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

Wenn Sie eine Klasse oder eine Methode mit einer constrained generic parameter verwenden, müssen Sie dasselbe für Ihre Methode (oder eine Klasse, je nachdem, wo die T definiert ist).

+0

Brilliant, funktioniert perfekt. Vielen Dank. –