gpt4 book ai didi

android - 求教,如何设置 'field'的notnull值'为false?

转载 作者:行者123 更新时间:2023-11-29 16:34:39 33 4
gpt4 key购买 nike

我想使用 room 在我的数据库中添加一个新列。我使用 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”。这使我的字段具有与预期表信息匹配的默认值。即:

sql.execSQL("ALTER TABLE table_name ADD COLUMN column_name INTEGER DEFAULT 1 not null")

关于android - 求教,如何设置 'field'的notnull值'为false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52764507/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com