如何在没有生成 id 的情况下使用 ORMLite 外来对象?

How to use ORMLite foreign objects WITHOUT generated id?

我正在学习如何通过 android 使用 ORMLite。我的问题是我从服务器收到带有 ID 的对象,我认为对我的数据库使用相同的 ID 会很好。这意味着我没有使用 generatedId = true,因此不能使用 foreignAutoGenerate = true

public class Artwork {

    @DatabaseField(id = true, columnName = "id")
    String id;

    @DatabaseField
    String name;

    @DatabaseField
    String file;

    @DatabaseField(columnName = "user_id", foreign = true, foreignAutoCreate = true)
    User owner;
}

如您所见,艺术品引用了拥有它的用户。两者在服务器端都已经有 ID,我想将其用作我的数据库的 ID。

public class User {

    @DatabaseField(id = true, unique = true)
    String id;

    @DatabaseField
    String name;
}

下面是魔法应该发生的地方...

Artwork artwork = new Artwork();
artwork.setName("name");
artwork.setFile("filepath");
artwork.setId("generated_by_server_0000");

User owner = new User();
owner.setId("generated_by_server_0001")
owner.setName("user");

artwork.setOwner(owner);

DatabaseHelper dbHelper = OpenHelperManager.getHelper(this, DatabaseHelper.class);

Dao<Artwork, String> artworkDao = dbHelper.getArtworkDao();
Dao<User, String> userDao = dbHelper.getUserDao();

userDao.create(owner);
artworkDao.create(artwork);

List<Artwork> artworksOnDb = artworkDao.queryForAll();

我如何使用 ORMLite 轻松地保留这些对象但自己设置 ID?

My problem is that I receive objects with an ID from the server and I think it would be good to use the same ID for my DB. This means I am not using generatedId = true and therefore cannot use foreignAutoGenerate = true

没错。你不必 generatedId = true 处理异物但不幸的是你 do 需要处理 foreignAutoCreate = true 因为否则 ORMLite 不知道User是否需要创建。如果您使用自己的 ID,则需要使用 UserDao 并直接创建 User 而不是依赖自动机制。

引用 docs for foreignAutoGenerate:

Set this to be true (default false) to have the foreign field automatically created using an internal DAO if its ID field is not set (null or 0). So when you call dao.create() on the parent object, any foreign field that has this set to true will possibly generate an additional create call via an internal DAO. By default you have to create the object using its DAO directly. By default you have to create the object using its DAO directly. This only works if generatedId is also set to true.

有一点很重要,你必须在插入 Artwork 之前插入 User ,因为 Artwork 在其 table 中存储了一个 user_id

User owner = new User();
owner.setId("generated_by_server_0001")
owner.setName("user");
...
// do this _before_ the create of Artwork
userDao.create(owner);

Artwork artwork = new Artwork();
artwork.setName("name");
...
artwork.setOwner(owner);
artworkDao.create(artwork);