如何在没有生成 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);
我正在学习如何通过 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);