【问题标题】:Android/ORMLite Insert Row with IDAndroid/ORMLite 插入带有 ID 的行
【发布时间】:2011-08-16 05:23:35
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: java android database sqlite ormlite


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我确实读过这个,但我认为我也可以输入我自己的 ID,因为在其他数据库中,即使它具有自动生成的主键,我也可以使用 id 插入.这是特定于 ORMLite 或 SQLite 数据库设置的东西吗?
      • 它特定于 ORMLite:参见ormlite.svn.sourceforge.net/viewvc/ormlite/ormlite-core/trunk/…,第 32 行。您会注意到它会自动为 generatedId 或 generatedIdSequence 设置分配 id,而不检查是否已经设置了值。如果您使用的是 SQLite,您可能只想手动写入数据库,然后使用 ORMLite 重新加载,或者为服务器数据库 ID 添加单独的列(这是我所做的,即使我不使用 ORMLite)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多