2012-04-23 4 views
11

私のAndroidプロジェクトでは、ORMLiteはキャッシュとして機能しています。私は、Webサーバーからデータをダウンロードし、データベースに配置しています。私はオブジェクトにcreateOrUpdateを呼び出していますが、重複がデータベースに表示されています。プライマリキー(単に自動インクリメント整数)以外のデータベースエントリは同じです。 2番目のオブジェクトにはまだプライマリキーがないので、1つおきのフィールドが同じであっても、ORMLiteは2つのオブジェクトが異なるとみなします。createOrUpdate()は、ORMLiteを使用してデータベースに常に新しいエントリを作成します

これが本当ですか?

答えて

16

オブジェクトが既ににidフィールドが設定されていない限り、createOrUpdateを呼び出すべきではありません。 ORMLiteがデータベースに存在するかどうかを判断する方法は、クエリバイIDで行うことです。コードは次のようになります。

ID id = extractId(data); 
// assume we need to create it if there is no id <<<<<<<<<<<<<<<<<<<<<<< 
if (id == null || !idExists(id)) { 
    int numRows = create(data); 
    return new CreateOrUpdateStatus(true, false, numRows); 
} else { 
    int numRows = update(data); 
    return new CreateOrUpdateStatus(false, true, numRows); 
} 

これを説明するためにjavadocsを拡張します。彼らは非常に弱いです。ごめんなさい。

これはデータベースにアイテムが存在しない場合に作成するための便利な方法です。 IDはデータ引数から抽出され、データベース上でIDによる照会が行われます。同じIDを持つデータベース内の行が存在する場合、データベース内のすべての列は、dataパラメーターのフィールドから更新されます。 idがnull(0またはその他のデフォルト値)であるか、データベースに存在しない場合、オブジェクトはデータベースに作成されます。これは、データ項目にidフィールドが定義されている必要があることも意味します。

+0

恐ろしいです!私はこれが行動であると思われ始めました。いくつかの光を放出していただきありがとうございます。 – Quentamia

+0

実際に私は、新しい挿入を得るために必要なデフォルト値でいくつかの光を放出するためにOPが+1している動作が必要です:)! – AgentKnopf

+2

'generatedId = true'データベースフィールドの注釈を持つ列はどうですか?また、データベースには常に新しいエントリが作成されます。 ['Bug#173'](http://sourceforge.net/p/ormlite/bugs/173/)を参照してください。 – user2784435

0

実際に固有の識別子に基づいて、既存のエントリのIDを手動で抽出してからupdateデータベースを抽出する必要があるようです。ユニークURLの例:

CacheItem newEntry = fetchEntry("..."); // fetch it here 
List<CacheItem> existing = mDao.queryForEq("url", newEntry.getUrl()); 
if (existing.size() > 0) { 
    int id = existing.get(0).getId(); 
    newEntry.setId(id); 
    mDao.update(newEntry); 
} else mDao.create(newEntry); 
0

正常に動作するようにプライマリキーを設定します。

@DatabaseField(columnName = "id"、uniqueIndex = true) プライベートint id;

私のために働きました。例外はバックグラウンドでスローされますが、動作します:D

関連する問題