2

我是 Android 新手,我对 ORMLITE 有疑问。

例如,假设我有这张表:

@DatabaseTable(tableName = "accounts")
public class Account {

    @DatabaseField(id = true)
    private int id;

    @DatabaseField(canBeNull = false)
    private String name;
    …

我想在不设置 id的情况下将新数据添加到我的表中。

我试过这样:

@DatabaseTable(tableName = "accounts")
public class Account {

@DatabaseField(generatedId = true,allowGeneratedIdInsert=true)
private int id;

@DatabaseField(canBeNull = false)
private String name;
…



> Account acc = new Account();
> 
> acc.setName("Example");
> 
> AccountDao.createOrupdate(acc);

在这里,我无法将 acc 插入到我的数据库中,因为 acc id 为零。我想生成id。我可以使用自动增量吗?

4

2 回答 2

3

在这里,我无法将 acc 插入到我的数据库中,因为 acc id 为零。我想生成id。我可以使用自动增量吗?

因此,要引用以下allowGeneratedIdInsert字段@DatabaseField的 javadocs :

如果此设置为 true,则插入已设置 ID 字段的对象将不会使用生成的 ID 覆盖它。当您有一个表,其中项目有时具有 ID 并且有时需要生成它们时,这很有用。这仅在数据库支持此行为并且generatedId()该字段也为 true 时才有效。

因此,如果您已acc.id设置为非 0 值,则应将其插入id 为 from的数据库acc。如果你想acc获得一个自动生成的 id,那么你应该设置acc.id为 0。

例如,您可以查看ORMLite Android 测试类。搜索testCreateWithAllowGeneratedIdInsert()具有如下代码的方法:

AllowGeneratedIdInsert foo = new AllowGeneratedIdInsert();
assertEquals(1, dao.create(foo));
AllowGeneratedIdInsert result = dao.queryForId(foo.id);
assertEquals(foo.id, result.id);
...

AllowGeneratedIdInsert foo3 = new AllowGeneratedIdInsert();
foo3.id = 10002;
assertEquals(1, dao.create(foo3));
result = dao.queryForId(foo3.id);
assertEquals(foo3.id, result.id);

注意:文档提到这仅在数据库支持但 Sqlite 是这些数据库之一的情况下才有效。

于 2013-09-16T14:03:54.080 回答
0

使用 Wrapper 类而不是 int

@DatabaseField(id = true)
private Integer id;
于 2017-08-08T14:47:16.367 回答