【发布时间】:2021-06-08 07:39:22
【问题描述】:
当您使用 Android Room 自动生成的插入方法时,它会将所有值传递给所有列例如,如果您有如下实体:
@Entity
public class Task {
@PrimaryKey(autoGenerate = true)
public long id;
@NonNull
@ColumnInfo(defaultValue = "Unknown Title")
public String name;
@NonNull
@ColumnInfo(defaultValue = "Does not have any description!")
public String desc;
@ColumnInfo(defaultValue = "false")
public boolean isDone;
}
您尝试通过以下方式插入Task 类的空实例:
taskDao.insert(new Task());
它将运行如下查询:
INSERT INTO Task (id, name, desc, isDone) values (null, null, null, 0);
这违反了我们的表结构规则,所以我们得到错误:
Caused by: android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: task.name (code 1299 SQLITE_CONSTRAINT_NOTNULL)
如果它使用这个查询:
INSERT INTO Task DEFAULT VALUES;
或
INSERT INTO Task (id) VALUES (null);
SQLite 使用所有默认值创建一行,没有任何错误。
但是要忽略插入查询中的空变量以使用默认值?
【问题讨论】:
-
你为什么不这样做:mName="Unknown title"
-
我将使用默认值,但有空间它会将 null 传递给数据库,而不是忽略它
-
我不明白你的意思,但如果你从 ColoumnInfo 中删除默认值并将默认值作为属性值传递,那么房间将设置此默认值如果用户错过了任何你想要的价值。
-
你说得对,但是你所说的设置了一个将传递给数据库的值,但是 ColumnInfo 中的默认列的值将在 where 不是像这个查询
INSERT INTO TABLE task (name) values ("my task");这样忽略 id、描述的传递值时使用和 is_done 列 -
我完全更新了我的问题
标签: android-room