Универсальный запрос таблицы Xamarin SQLite.NET

Я использую компонент «SQLite.NET» в своем Xamarin-проекте. У меня есть несколько «моделей/классов», таких как «Документ», «Проект». Каждая модель имеет свою таблицу в SQLite.

Чтобы получить данные из таблицы, я использую следующую технику:

List<Document> documents = new SQLiteConnection("..DB-path..").Table<Document>.ToList();

Он отлично работает, но для каждой таблицы мне нужно сделать один и тот же код и изменить только тип модели в приведенном выше коде.

Теперь я хотел бы написать общий метод, где я могу сделать:

List<T> data = new SQLiteConnection("..DB-path..").Table<T>.ToList();

Но, к сожалению, я получаю следующую ошибку:

«T» должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «SQLiteConnection.Table()».

Кто-нибудь знает способ создать общий метод для проблемы выше?

Заранее спасибо!


person Benjamin Ceustermans    schedule 29.03.2016    source источник
comment
Можете ли вы включить весь метод, содержащий вашу строку кода, с использованием универсальных типов? Как вы объявляете T? В качестве примечания: вам не нужно создавать новый SQLiteConnection каждый раз, когда вы обращаетесь к базе данных, на самом деле считается лучшей практикой использовать одноэлементное соединение.   -  person dylansturg    schedule 29.03.2016
comment
Если вам также нужны общие запросы, проверьте это: stackoverflow.com/questions/29050400/   -  person xleon    schedule 30.03.2016


Ответы (1)


Вы должны добавить ограничение к своей функции.

public List<T> GetData<T> () where T: new()
{
    using(var connection = new SQLiteConnection("..DB-path..")){
       return connection.Table<T>.ToList();
    }
}

Не забудьте удалить соединение с БД!

person Artem Zelinskiy    schedule 29.03.2016
comment
Утилизация соединения иногда может привести к сбою, если в то же время возникают другие параллельные запросы (если вы используете асинхронные запросы). Вместо этого я бы использовал только одно соединение, которое оставалось бы открытым на протяжении всего жизненного цикла приложения. - person xleon; 30.03.2016
comment
@xleon Это правда, и я согласен с вами, что лучше использовать одно соединение. Но текущая реализация Бенджамина не использует этот подход. Поэтому в случае, если вы не используете соединение повторно, вы должны как можно скорее удалить его и использовать попытку с ресурсами. - person Artem Zelinskiy; 31.03.2016