2016-03-29 9 views
4

私はXamarinプロジェクトでコンポーネント "SQLite.NET"を使用します。 私は "Document"、 "Project"のようないくつかの "モデル/クラス"を持っています。 各モデルはSQLiteに独自のテーブルを持っています。テーブルからデータを取得するためにXamarin SQLite.NETジェネリック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

ジェネリッククエリもご希望の場合は、次のURLをご覧ください: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(); 
    } 
} 

DB接続を忘れないでください。

+0

Thanks Greensy、 ワーキング! –

+1

非同期クエリを使用する場合、同時に他のパラレルクエリが発生すると、接続を破棄することがあります。私は、アプリ全体のライブサイクルで開いたままにする接続を1つだけ使用します。 – xleon

+0

@xleon Thats true、1つの接続を使用する方が良いことに同意します。しかし、Benjaminの現在の実装では、このアプローチを利用していません。そのため、接続を再利用しない場合は、できるだけ早く廃棄し、 "試用リソース"を利用する必要があります。 – Greensy

関連する問題