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
。