2013-04-24 15 views
5

Tôi đang sử dụng SQLite-net (https://github.com/praeclarum/sqlite-net) để thực hiện một cơ sở dữ liệu sử dụng Mono trên Android và đã điều sau đây:Tạo truy vấn chung trong SQLite-net C# sử dụng 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); 
    } 

này là rất tốt cho tôi một danh sách các cổ phiếu, nhưng tôi dự tính có một bộ sưu tập các bảng trong dự án của tôi và không muốn tạo một AddX, GetAllX, QueryReturns (X) riêng biệt, vv cho mỗi bảng. Tôi sau một cách chung chung làm các hoạt động cơ sở dữ liệu và thử như sau:

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

Tuy nhiên, nó không biên dịch nói: 'T' phải là một loại phi trừu tượng với một constructor parameterless công để sử dụng nó làm tham số 'T' trong kiểu generic hoặc phương thức 'DatabaseUtility.AsyncTableQuery'.

Bất kỳ ý tưởng nào về cách tôi có thể truy cập loại cơ sở dữ liệu chung này hoạt động như thế nào?

Trả lời

5

tôi không thực sự biết internals SQLite, nhưng đây là khoảng Nghiêm generics ...

Kể từ AsyncTableQuery được định nghĩa như thế này

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

... hoặc chỉ dựa trên lỗi của bạn, bạn cần phải đặt cùng chế trên T của bạn:

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

Nếu bạn đang sử dụng một lớp học hoặc một phương pháp có constrained generic parameter - bạn cần phải làm tương tự trên phương pháp của bạn (hoặc một lớp học, tùy thuộc vào nơi mà các T được xác định).

+0

Rực rỡ, hoạt động hoàn hảo. Cảm ơn. –

Các vấn đề liên quan