Создание общих запросов в SQLite-net C# с использованием SQLiteAsyncConnection

Я использую SQLite-net (https://github.com/praeclarum/sqlite-net ) для реализации базы данных с помощью Mono на Android и иметь следующее:

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» должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «DatabaseUtility.AsyncTableQuery».

Любые идеи о том, как я могу получить такой общий доступ к базе данных?


person Dave W    schedule 24.04.2013    source источник


Ответы (1)


Я действительно не знаю внутренностей SQLite, но это строго о generics...

Поскольку AsyncTableQuery определяется так

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

...или просто исходя из вашей ошибки, вам нужно установить такое же ограничение для вашего T:

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

Если вы используете класс или метод, который имеет constrained generic parameter, вам нужно сделать то же самое в своем методе (или классе, в зависимости от того, где определено T).

person NSGaga-mostly-inactive    schedule 25.04.2013