【问题标题】:How to use ORMLite foreign objects WITHOUT generated id?如何在没有生成 id 的情况下使用 ORMLite 外来对象?
【发布时间】:2016-06-21 08:27:49
【问题描述】:

我正在学习如何将 ORMLite 与 android 一起使用。我的问题是我从服务器接收到带有 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;
}

如您所见,Artwork 引用了拥有它的用户。两者都已经在服务器端有 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?

【问题讨论】:

标签: java android ormlite


【解决方案1】:

我的问题是我从服务器接收到带有 ID 的对象,我认为最好为我的数据库使用相同的 ID。这意味着我没有使用 generatedId = true ,因此不能使用 foreignAutoGenerate = true

没错。您不必对外部对象执行generatedId = true,但不幸的是您确实需要对foreignAutoCreate = true 执行此操作,否则ORMLite 将不知道是否需要创建User或不。如果您使用自己的 id,则需要使用 UserDao 并直接创建 User,而不是依赖自动机制。

引用docs for foreignAutoGenerate

将此设置为 true(默认为 false),如果未设置外部字段的 ID 字段(null 或 0),则使用内部 DAO 自动创建外部字段。因此,当您在父对象上调用 dao.create() 时,任何将此设置为 true 的外部字段都可能会通过内部 DAO 生成额外的创建调用。默认情况下,您必须直接使用其 DAO 创建对象。默认情况下,您必须直接使用其 DAO 创建对象。 只有在 generatedId 也设置为 true 时才有效。

重要的是要意识到,您必须在插入Artwork 之前插入User ,因为Artwork 在其表中存储了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);

【讨论】:

  • 根据文档 (ormlite.com/javadoc/ormlite-core/doc-files/…) 如果generatedId = true,我只能使用 ForeignAutoCreate。正如你所说,我将不得不直接创建它们。
  • 嗯,有道理@Rauter。也许我应该知道,因为我写了它。 :-}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2023-03-28
  • 2021-11-25
  • 2014-05-03
  • 2016-01-02
相关资源
最近更新 更多