5

AndroidでMonoを使用してデータベースを実装するためにSQLite-net(https://github.com/praeclarum/sqlite-net)を使用しており、次のものがあります。

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

これは株式のリストを提供するのに最適ですが、プロジェクトにテーブルのコレクションがあることを想定しており、テーブルごとに個別の AddX、GetAllX、QueryReturns(X) などを作成したくありません。私はこれらのデータベース操作を行う一般的な方法を求めており、次のことを試しました。

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

ただし、「T」は、ジェネリック型またはメソッド「DatabaseUtility.AsyncTableQuery」でパラメーター「T」として使用するために、パブリックパラメーターなしのコンストラクターを持つ非抽象型である必要があります。

この種の一般的なデータベース アクセスを機能させる方法についてのアイデアはありますか?

4

1 に答える 1