使用SQLiteAsyncConnection在SQLite-net c#中创建通用查询

本文关键字:创建 查询 SQLiteAsyncConnection SQLite-net 使用 | 更新日期: 2023-09-27 18:10:38

我使用SQLite-net (https://github.com/praeclarum/sqlite-net)在Android上使用Mono实现数据库,并有以下内容:

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'。

关于如何获得这种通用数据库访问工作的任何想法?

使用SQLiteAsyncConnection在SQLite-net c#中创建通用查询

我真的不知道SQLite的内部,但这是严格关于generics

既然AsyncTableQuery是这样定义的

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

…或者只是基于你的错误,你需要把相同的约束在你的T:

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

如果你使用的类或方法有constrained generic parameter -你需要对你的方法(或类)做同样的事情,(取决于T的定义位置)。