2016-03-29 3 views
4

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

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

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

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

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

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

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

'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'SQLiteConnection.Table()'

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

Заранее благодарен!

+0

Можете ли вы включить весь метод, который содержит вашу строку кода, используя общие типы? Как вы объявляете 'T'? В качестве дополнительной заметки вам не нужно создавать новый 'SQLiteConnection' каждый раз, когда вы обращаетесь к базе данных, на самом деле считается, что лучше использовать одноточечное соединение. – dylansturg

+0

Если вы также хотите получить общие запросы, ознакомьтесь с этим: http://stackoverflow.com/questions/29050400/generic-repository-for-sqlite-net-in-xamarin-project/29856945#29856945 – xleon

ответ

3

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

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

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

+0

Thanks Greensy, Это за работой! –

+1

Устранение связи иногда может возникать, если одновременно возникают параллельные запросы (если вы используете асинхронные запросы). Я бы использовал только одно соединение, которое будет оставаться открытым в целом в реальном времени в приложении. – xleon

+0

@xleon Thats true, и я согласен с вами, что лучше использовать одно соединение. Но нынешняя реализация Бенджамина не использует этот подход. Поэтому в случае, если вы не будете повторно использовать соединение, вы должны утилизировать его как можно скорее и использовать «try-with-resources». – Greensy

Смежные вопросы