7

我目前正在使用 ORMLite 在 Android 上使用 SQLite 数据库。作为其中的一部分,我正在从后端服务器下载一堆数据,我希望将这些数据以与后端服务器上完全相同的格式添加到 SQLite 数据库中(即 ID 相同等) .

所以,我的问题是,如果我通过 setId() 填充我的数据库条目对象(我们将其称为 Equipment),包括 Equipment 的 generateId/主键字段,然后我使用该 Equipment 条目运行 DAO.create() 将该ID是否正确保存?我以这种方式尝试过,但在我看来并非如此。如果是这种情况,我将再试一次并寻找其他问题,但在前几次通过代码时,我无法找到问题。所以本质上,如果我在一个设置了 ID 的数据库对象上调用 DAO.create() ,该 ID 将被发送到数据库,如果不是,我如何插入已经填写了主键值的行?

谢谢!

4

2 回答 2

14

@Femi 是正确的,对象可以是生成的 idid,但不能同时是两者。问题不仅仅在于 ORMLite 如何存储对象,还必须与生成数据库的模式相匹配。

ORMLite支持允许此行为allowGeneratedIdInsert=true的注释选项。@DatabaseField某些数据库类型(例如 Derby)不支持此功能,但可在 Android/SQLite 下工作。

对于后代,您还可以创建 2 个共享同一个表的对象 - 一个具有生成的 ID,一个没有。然后,您可以使用生成的 id Dao 插入以获取该行为,并使用另一个 Dao 获取调用者设置的 id 值。这是另一个谈论这个的答案。你的问题听起来像是这会产生很多额外的 DAO。

唯一的其他解决方案是不要将 id 用于您的目的。让数据库生成 id,然后为您的目的在外部设置一个您使用的附加字段。在某些情况下强制使用数据库 ID 在我看来是一种不好的模式。

于 2011-08-16T16:05:08.743 回答
4

来自http://ormlite.com/docs/generated-id

布尔字段是否为自动生成的 id 字段。默认为假。一个类中只有一个字段可以有此设置。这告诉数据库为插入的每一行自动生成一个相应的 id。当使用Dao.create() 方法创建具有生成ID 的对象时,数据库将为该行生成一个ID,该ID 将由create 方法返回并设置在对象中。一些数据库需要生成 id 的序列,在这种情况下,序列名称将自动生成。要指定序列的名称,请使用 generatedIdSequence。只能指定 id 和 generatedIdSequence 之一。

您必须使用generatedId(在这种情况下似乎必须生成所有 id)或id(在这种情况下您可以设置它们),但不能同时使用两者。

于 2011-08-16T06:03:20.100 回答