【问题标题】:queryForAll returns null ids with ORMLite AndroidqueryForAll 使用 ORMLite Android 返回空 id
【发布时间】:2016-09-24 11:37:31
【问题描述】:

我正在尝试在 Android SQLite 数据库上创建和获取一些数据。

当我使用 create 方法添加数据时,对象会正确更新(设置了 Long id)。但是,当我使用 queryAll 方法获取数据时,对象被正确返回,除了 id 属性为空。 我正在使用 DatabaseField 标记并将 generatedId 属性设置为 true,就像文档说的那样:

生成的Id

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

这是我的课:

@DatabaseTable(tableName = "LANGUAGE")
public class Language {

    @DatabaseField(generatedId = true, columnName = "language_id")
    private Long id;

    @DatabaseField(columnName = "language_locale")
    private String locale;

    @DatabaseField(columnName = "language_active")
    private boolean active;

    @DatabaseField(columnName = "language_name")
    private String name;

    // getters and setters...

}

我正在插入这样的数据:

Language pt = new Language();
pt.setActive(true);
pt.setName("Português");
pt.setLocale("pt_PT");
dao.create(pt);

Language en = new Language();
en.setActive(true);
en.setName("English");
en.setLocale("en_EN");
dao.create(en);

// here, both pt and en have an id, 1 and 2, respectively

但是当我执行时

dao.queryForAll()

locale、active 和 name 属性都可以,但 id 为空。

有什么想法吗?我已经尝试在 create 之后调用 commit,但没有任何变化。

【问题讨论】:

  • 你确定你的数据库配置文件已经完全更新了吗?我从未见过或听说过这一点,尤其是 id 字段。 dao.queryForId(...) 工作但也不填写 id 吗?
  • queryForId(例如传递 id 1)返回 null。这很奇怪,似乎create方法可以完成这项工作,但是数据库存储了没有id的实体......根据我的经验,我一定有一些小错误,只能通过try-error找到它......任何帮助都是赞赏
  • 并且ids是通过create方法正确/按顺序分配的,所以看起来实体实际上在数据库上。你认为这可能是一些缓存问题吗?
  • 这似乎查询过程不知道 id 文件。您有过期的ormlite_config.txt 文件吗?
  • 老实说,我的 android 项目中没有任何 ormlite_config.txt。我已经添加了依赖项,创建了实体和 db 助手并且它可以工作(除了这个 id 问题)。我应该创建一个吗?

标签: android sqlite ormlite


【解决方案1】:

我遇到了同样的问题。我认为这与答案有关:https://stackoverflow.com/a/34909528

清除应用数据有效,但您不能向用户索取;)

SQLite 具有有限的 ALTER TABLE 支持,您可以使用它来将列添加到表的末尾或更改表的名称。如果要对表结构进行更复杂的更改,则必须重新创建表。您可以将现有数据保存到临时表中,删除旧表,创建新表,然后将数据从临时表中复制回来。

【讨论】:

    【解决方案2】:

    终于搞定了。客人什么?只需清除数据并卸载应用程序即可开始使用。不要问我到底为什么,但肯定是和id注解有关。起初我使用的是:

    @DatabaseField(id = true, allowGeneratedIdInsert = true, columnName = "language_id")
    

    给出一个错误,然后我已更改为另一种组合,并且在中间的某处必须使用某些属性创建数据库。然后,我将其更改为我的问题中显示的配置,但没有按照我的解释工作。清理手机上的应用程序后,一切都必须从头开始创建,并且最终创建了具有正确属性的数据库。

    因此,如果将来您的数据库无法正确存储或加载数据,只需清除并卸载该应用即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多