2016-03-29 8 views
4

Ich benutze die Komponente "SQLite.NET" in meinem Xamarin-Projekt. Ich habe mehrere "Modelle/Klassen" wie "Document", "Project". Jedes Modell hat seine eigene Tabelle in SQLite.Xamarin SQLite.NET Generic TableQuery

Um die Daten aus einer Tabelle zu erhalten, ich bin die folgende Technik:

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

Es funktioniert gut, aber für jede Tabelle Ich habe den gleichen Code zu tun und nur den Modelltyp zu ändern in der Code oben.

Nun würde Ich mag eine generische Methode schreiben, wo ich tun kann:

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

Aber leider bekomme ich folgende Fehlermeldung:

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

Kennt jemand eine Möglichkeit, eine generisch zu schaffen Methode für das obige Problem?

Vielen Dank im Voraus!

+0

Können Sie die gesamte Methode, die Ihre Codezeile enthält, mit generischen Typen verwenden? Wie erklärst du 'T'? Als Nebenbemerkung müssen Sie nicht jedes Mal, wenn Sie auf die Datenbank zugreifen, eine neue 'SQLiteConnection' erstellen. In der Tat wird es als bessere Praxis angesehen, eine Singleton-Verbindung zu verwenden. – dylansturg

+0

Wenn Sie auch generische Abfragen möchten, überprüfen Sie dies: http://stackoverflow.com/questions/29050400/generic-repository-for-sqlite-net-in-xamarin-project/29856945#29856945 – xleon

Antwort

3

Sie sollten eine Einschränkung zu Ihrer Funktion hinzufügen.

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

Vergessen Sie nicht, Ihre DB-Verbindung zu entsorgen!

+0

Danke Greensy, Es ist Arbeiten! –

+1

Die Bereitstellung der Verbindung kann manchmal ausgelöst werden, wenn andere parallele Abfragen gleichzeitig auftreten (wenn Sie asynchrone Abfragen verwenden). Ich würde nur eine Verbindung verwenden, die im gesamten App-Live-Zyklus geöffnet bleiben würde. – xleon

+0

@xleon Das stimmt, und ich stimme Ihnen zu, dass es besser ist, eine Verbindung zu verwenden. Benjamins aktuelle Implementierung verwendet diesen Ansatz jedoch nicht. Für den Fall, dass Sie die Verbindung nicht wiederverwenden, sollten Sie sie so schnell wie möglich entsorgen und "try-with-resources" verwenden. – Greensy