1

Android 2.2以降をターゲットにしています。このエラーは、4.x を実行しているデバイスで生成されました。ORMLite 4.38 ライブラリを使用しています。

すべてのレコード インスタンスが任意の数のデバイスに対して一意であることを保証する必要があります。ORMLite が UUID を ID としてサポートしていることを知り、うれしく思いました。データベース レコード定義の UUID - id 抽象基本クラスを作成しました。 allowGeneratedIdInsert完璧なソリューションです。しかし、この機能は「IllegalStateException: could not create data element in dao」を引き起こすようです。この注釈を削除してテストしましたが、問題はありません。それを元に戻してください...同じ問題。基本クラスのものを1つのレコード定義に入れます...同じ問題。

LogCat は次のことも報告します。

原因: java.sql.SQLException: オブジェクトで挿入 stmt を実行できません - objectid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx

public abstract class UUIDDaoEnabled<T> extends BaseDaoEnabled<T, UUID> {

    //allowGeneratedIdInsert allows us to set UUID when this device db didn't create it
    @DatabaseField(generatedId = true, allowGeneratedIdInsert=true)
    private UUID id;
    ...
    public void setUUIDFromSerializedSource(SerializedModelBinaryInputStream stream, Dao<T, UUID> dao) throws SQLException { //only place we can set UUIDs
        if(id == null)
            dao.refresh((T)this); 

        if(id != null)
            throw new SQLException("Trying to set UUID on existing object");

        id = stream.getCurrentUUID();
    }
    }

私は次のように専門化します:

@DatabaseTable()
public class Type extends UUIDDaoEnabled<Type> { ... }

allowGeneratedIdInsertとのドキュメントからこれを説明することはできませんgeneratedId。実際、alloeGeneratedIdInsert のドキュメントには、生成された Id のデフォルトの動作をオーバーライドすると書かれています。それはまた言います

これは、データベースがこの動作をサポートしている場合にのみ機能します

それでも、ORMLite 4.25 (?) 以降が Android デバイスでこの動作をサポートしているという他の投稿を読みました。したがって、それは完全に真実ではありません。または、私は何か愚かなことをしています...誰か???

allowGeneratedIdInsert更新: 少し考えた後、同じ抽象クラスに基づいて他のオブジェクトをインスタンス化するため、サポートも継承も根本的な原因ではないことに気付きました。私が理解できないのは、特定のクラスが問題を引き起こしている理由です。問題のあるレコード タイプの唯一のユニークな点 (作成する他のタイプと比較して) は、それが 1 対多であり、複数対多が含まれていることです。これらのプロパティを と組み合わせるとallowGenereatedIdInsert、根本的な問題になる可能性がありますか? むしろ、この状況でこの問題を見た人はいますか?

更新: 質問を気にしないでください。updateId(...)の代わりに使えますallowGeneratedIdInsert

4

2 に答える 2

3

これについてはよくわかりませんが、同じ UUID ID を持つテーブルに要素を 2 回挿入しようとしているように見えます。例外は、制約の失敗があることを示しています。

IllegalStateException: Could not create data element in dao
    at BaseForeignCollection.add(BaseForeignCollection.java:57)
...
Caused by: SQLiteConstraintException: error code 19: constraint failed

を呼び出すforeignCollection.add(...);と -- と同じことをdao.create(...);行いますが、同じオブジェクトでこれらの両方を行うことはできません。DAO によって既に作成された既存のオブジェクトがあり、それを別のオブジェクトに関連付ける場合は、次のようにする必要があります。

   // associate this object with another
   existingObject.setForeignField(...);
   // now update it in the db
   existingObjectDao.update(existingObject);

それをforeignFieldの外部コレクションに追加することはできません.

于 2013-02-02T20:03:16.913 に答える
1

同様の問題がありました。しかし、オブジェクトを保存するために createOrUpdate の代わりに create を使用したことが原因でした。

これを変更する前にアプリケーションをアンインストールして、データベースが削除され、古い動作が維持されないようにすることも重要です。

編集: createOrUpdate は非常に時間がかかります。大量のデータを使用して作成する方がよいでしょう。

編集 2: TransactionManager.callInTransactionを使用することもお勧めします。

于 2013-09-11T21:45:13.310 に答える