使用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'。
关于如何获得这种通用数据库访问工作的任何想法?
我真的不知道SQLite的内部,但这是严格关于generics
…
既然AsyncTableQuery
是这样定义的
public class AsyncTableQuery<T>
where T : new ()
{
…或者只是基于你的错误,你需要把相同的约束在你的T
:
public class DBQuery<T> where T : new ()
如果你使用的类或方法有
constrained generic parameter
-你需要对你的方法(或类)做同样的事情,(取决于T
的定义位置)。