android - 房间,如何设置“字段的非空值”为假?
问题描述
我想使用房间在我的数据库中添加一个新列。我使用 Room 的迁移将我的数据库迁移到新版本,但它无法正常工作。INTERGER 字段的默认 notnull 值为 true,这对我来说真的很麻烦。请帮我。我已经坚持了好几个小时。
我有一个位置类。
package com.example.phamf.javamvvmapp.Model;
import ...
@Entity (tableName = "location")
public class Location {
@PrimaryKey(autoGenerate = true)
private int id;
private float x;
private float y;
private String name;
public Location(int id, float x, float y, String name) {
this.id = id;
this.x = x;
this.y = y;
this.name = name;
}
public Location () {
}
// Getter and setter
}
我想添加一个名为 type 的新字段,它的类型是 INTEGER 所以我修改上面的 Location.java 文件,如
package com.example.phamf.javamvvmapp.Model;
import ...
@Entity (tableName = "location")
public class Location {
@PrimaryKey(autoGenerate = true)
private int id;
private int type;
private float x;
private float y;
private String name;
public Location(int id, float x, float y, String name, int type) {
this.id = id;
this.x = x;
this.y = y;
this.name = name;
this.type = type;
}
public Location () {
}
// Getter and setter
}
这是我的 RoomDatabase 类。
@Database(entities = {Location.class}, version = 2)
public abstract class LocationRoomDatabase extends RoomDatabase {
private static LocationRoomDatabase DATABASE;
public static LocationRoomDatabase getDatabase (final Context context) {
Migration migration = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE location ADD type INTEGER");
}
};
if (DATABASE == null) {
DATABASE = Room.databaseBuilder(context, LocationRoomDatabase.class, "database")
.addMigrations(migration).build();
}
return DATABASE;
}
public abstract LocationDAO locationDAO();
}
问题是当我运行上面的代码时,我得到一个错误
//...
Caused by: java.lang.IllegalStateException:
Migration didn't properly handle location(com.example.phamf.javamvvmapp.Model.Location).
Expected:
TableInfo{..., type=Column{name='type', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, foreignKeys=[], indices=[]}
Found:
TableInfo{..., type=Column{name='type', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
//...
Expected TableInfo 和 Found TableInfo 之间唯一不同的是“notNull 值”。Expected 希望它是真的,但 Found 不是。我意识到问题就在那里,所以我修改了我的迁移代码
Migration migration = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE location ADD type INTEGER not null");
}
};
我以为它会完美运行,但后来出现错误
Caused by: android.database.sqlite.SQLiteException: Cannot add a NOT NULL column with default value NULL (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE location ADD type INTEGER not null
我也尝试向“类型”字段添加默认值,但它也不起作用
private int type = 0;
有什么办法可以解决这个问题,请帮助我。太感谢了。为任何语法错误道歉。
解决方案
我终于找到了解决方案。通过在 SQL 命令中的“... ADD COLUMN column_name”之后添加“DEFAULT someValue”。这使我的字段具有与预期表信息匹配的默认值。IE :
sql.execSQL("ALTER TABLE table_name ADD COLUMN column_name INTEGER DEFAULT 1 not null")
推荐阅读
- python-3.x - 尝试将 True 或 False 附加到基于索引的表中
- java - java.lang.ArrayIndexOutOfBoundsException 在索引“1”,大小“1”,当我点击最喜欢的图标
- mysql - 我的数据库表上的并发更新问题
- c# - 如何从代码隐藏(ASP.NET)中找到一个控件并将其更改为选中/未选中
- store - 为什么无法从微服务登录 API-Store?
- c# - 在导出 gridview 分页时遇到问题启用 excel
- c# - 有没有办法在网格中使用多个寄存器的标题?
- plsql - 在返回结果集的 SQL Developer 中调用存储过程?
- web3js - 如何存储来自 Web3 web3.eth.getAccounts() 的结果
- json - 使用 GraphQL 和 Gatsby 导入带有动态字段的 JSON