2016-03-29 18 views
4

Xamarin projemde "SQLite.NET" bileşenini kullanıyorum. "Belge", "Proje" gibi birkaç "model/sınıf" var. Her modelin kendi SQLite Tablosu vardır.Xamarin SQLite.NET Generic TableQuery

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

Düzgün çalışır, ancak her tablo için ben aynı kodu yapmak ve sadece Modeli tipi değişen zorunda:

i aşağıdaki tekniğini kullanıyorum tablodan veri almak için Yukarıdaki kod. Şimdi

Ben Yapabileceğim genel bir yöntem yazmak istiyorum:

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

Ama ne yazık ki, aşağıdaki hatayı alıyorum:

'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()'

herkes bir jenerik oluşturmak için bir yol biliyor mu Yukarıdaki problem için yöntem?

Şimdiden teşekkürler!

+0

Genel türler kullanarak kod satırınızı içeren tüm yöntemi ekleyebilir misiniz? T'yi nasıl ilan ediyorsunuz? Bir yan not olarak, veritabanına her eriştiğinizde yeni bir 'SQLiteConnection 'oluşturmanız gerekmez, aslında bir singleton bağlantısı kullanmak daha iyi bir uygulama olarak kabul edilir. – dylansturg

+0

Ayrıca, genel sorguları da isterseniz, şu adresi kontrol edin: http://stackoverflow.com/questions/29050400/generic-repository-for-sqlite-net-in-xamarin-project/29856945#29856945 – xleon

cevap

3

Size bir kısıtlama eklemelisiniz.

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

DB bağlantınızı elden çıkarmayı unutmayın!

+0

Thanks Greensy, Çalışma! –

+1

Bağlantının atılması bazen aynı anda başka paralel sorgular ortaya çıkarsa atılabilir (asenkron sorgular kullanırsanız). Ben tüm uygulama canlı döngüsünde açık kalacak bir bağlantı kullanacağım yerine – xleon

+0

@ xleon Thats true, ve size katılıyorum, bir bağlantı kullanmak daha iyidir. Ancak Benjamin'in mevcut uygulaması bu yaklaşımı kullanmıyor. Bu durumda, bağlantıyı yeniden kullanmadığınız zaman, ASAP'yi elden çıkarmanız ve "kaynakları kullanmaya" çalışmanız gerekir. – Greensy