Android Room - 自动生成主键

16

我在使用 Android 的 Room 持久化库时遇到了一个问题,但是我找不到相关的文档。这个问题涉及到自动生成主键。

我有一个类实体,看起来像这样:

@Entity
public class Preference {

    @PrimaryKey(autoGenerate = true)
    private int id;

    public void setId(int id) {

        this.id = id;

    }

}

当我手动设置id时,这个工作良好,但是当我不设置主键时,我会收到与主键为空有关的错误。查看自动生成的文件,我无法看到任何地方它会自动递增主键。

所以我的问题是:是否可以使用setter自动生成私有成员的主键,还是我需要在setter中手动自动生成我的键?

1个回答

17

好的,由于成员为null,这段代码将不会生成id成员。我可以将其设置为Integer对象,这样当成员为空时,它将自动生成一个新的id,或者,在初始化对象时将其设置为0,这样也可以实现相同的效果。

我已经将其设置为Integer类型,这完美地解决了我的问题。

@Entity
public class Preference {

    @PrimaryKey(autoGenerate = true)
    private Integer id;

    public void setId(Integer id) {

        this.id = id;

    }

}

1
@ghosh 我已将其添加到上面的答案中。您需要使用Integer类,而不是基本类型int。 - James Lendrem
谢谢,我已经弄清楚了。 我正在将生成的密钥用作队列中的“票据”。我无法让它在每次应用程序运行时从1开始。clearAllTables没有帮助... - Eggcellentos
1
没问题。你遇到的问题是,虽然 'clearAllTables' 删除了表中的信息,但它在此过程中没有重置自动增量 id。我不确定 Room 是否内置了这个功能,但你可以通过在 Room 中运行查询来实现:'ALTER TABLE tablename AUTO_INCREMENT = 1'。请注意,这将重置索引但不会删除数据。 - James Lendrem
我以前尝试过,Room 并不直接支持它。我尝试了 RawQuery 来尝试注入命令,但没有成功,大多数是“语法错误”或者什么也没有发生... 我会继续努力的,非常感谢。 - Eggcellentos
你有错误吗?也许我可以帮你更进一步。 - James Lendrem
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接