如何使用ORMLite外部对象而不生成id?

时间:2016-06-15 15:39:02

标签: java android ormlite

我正在学习如何在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;
}

如您所见,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?

1 个答案:

答案 0 :(得分:1)

  

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

右。您不必使用外国对象generatedId = true但不幸的是,您 需要使用foreignAutoCreate = true,因为否则ORMLite不会知道是否需要创建User。如果您使用自己的ID,则需要使用UserDao并直接创建User,而不是依赖自动机制。

引用docs for foreignAutoGenerate

  

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

重要的是要认识到,在插入User 之前必须插入Artwork ,因为Artwork存储了user_id 1}}在其表中。

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);