4

失敗したコードは次のとおりです(アクティビティ内で実行されており、DBヘルパーがデータベースにWishListオブジェクトを作成します)

DatabaseHelper helper = DatabaseHelper.getInstance( getActivity() );
int savedID = 0;
WishList wl = new WishList();
wl.setName("abc");
try {
    savedID = helper.getWishListDao().create(wl);
    WishList wl_saved = helper.getWishListDao().queryForId( savedID );
    wl_saved.getId();
} catch (SQLException e) {
    e.printStackTrace();
}

これが私のエンティティです。ID フィールドは自動生成されます。

@DatabaseTable
public class WishList {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField( canBeNull = false , unique = true )
    private String name;

    @ForeignCollectionField
    private ForeignCollection<WishItem> items;
    ...

データベースで生成された ID が、以下の呼び出しで ORMlite が返す ID と同じではないことが問題です。1 を返します。

 savedID = helper.getWishListDao().create(wl);

データベースの ID は実際には 37 です。何が間違っているのでしょうか? バージョン 4.41 の使用

4

1 に答える 1

22

ORMLite の Dao.create(...)メソッドは、新しく作成されたオブジェクトの ID を返すのではなくDao.create(...)、変更されたデータベース内の行数 (通常は 1) を返します。

オブジェクトからデータベースに新しい行を作成します。作成されるオブジェクトが DatabaseField. generatedId() を使用する場合、データ パラメータは変更され、データベースからの対応する ID で設定されます。... 戻り値:データベースで更新された行数。これは 1 である必要があります。

ORMLite がオブジェクトを作成すると、生成された ID がid後でフィールドに設定されます。新しいオブジェクトの ID を見つけるには、オブジェクト自体から取得します。

// create returns 1 row changed
helper.getWishListDao().create(wl);
// the id field is set on the w1 object after it was created
savedID = w1.getId();
于 2012-07-05T14:13:42.633 に答える