预填充房间数据库抛出错误-架构似乎是错误的



我试图在我的Android应用程序中预填充数据库,但我得到了以下错误:

java.lang.IllegalStateException: Pre-packaged database has an invalid schema: Animal(com.example.application.db.Animal).
Expected:
TableInfo{name='Animal', columns={gender=Column{name='gender', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='Animal', columns={gender=Column{name='gender', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, name=Column{name='name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}

我真的不明白问题出在哪里,好像完全一样。

这是代码中抛出错误的地方,当数据库模式与它试图插入的条目进行比较时:

@Override
protected RoomOpenHelper.ValidationResult onValidateSchema(SupportSQLiteDatabase _db) {
final HashMap<String, TableInfo.Column> _columnsAnimal = new HashMap<String, TableInfo.Column>(2);
_columnsAnimal.put("gender", new TableInfo.Column("gender", "TEXT", false, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsAnimal.put("name", new TableInfo.Column("name", "TEXT", true, 1, null, TableInfo.CREATED_FROM_ENTITY));
final HashSet<TableInfo.ForeignKey> _foreignKeysAnimal = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesAnimal = new HashSet<TableInfo.Index>(0);
final TableInfo _infoAnimal = new TableInfo("Animal", _columnsAnimal, _foreignKeysAnimal, _indicesAnimal);
final TableInfo _existingAnimal = TableInfo.read(_db, "Animal");
if (! _infoAnimal.equals(_existingAnimal)) {  <<<<<<<<<this goes wrong, see next picture
return new RoomOpenHelper.ValidationResult(false, "Animal(com.johndoes.animalsounds.db.Animal).n"
+ " Expected:n" + _infoAnimal + "n"
+ " Found:n" + _existingAnimal);
}

图像被抛出的位置

这是我的实体类:

import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "Animal")
public class Animal {
@ColumnInfo(name = "gender")
public final String gender;
@PrimaryKey
@NonNull
@ColumnInfo(name = "name")
public final String name;

public Animal(@NonNull String  name, String gender) {
this.name = name;
this.gender = gender;
}
}

这就是创建我想要预加载的sqlite表的SQL:

CREATE TABLE "Animal" (
"name"  TEXT,
"gender"    TEXT,
PRIMARY KEY("name")
);

任何想法都将不胜感激,谢谢。

正如我所理解的,你说你的主键是name,但这是绝对错误的,即使你把它定义为文本,数据库中的文本数据类型总是nullable——你应该把一个长数据类型定义为你的表id,并把它添加为primary key,同时从动物名称中删除not null属性。

在您的sqlite上添加"name" TEXT NOT NULL

希望这能帮助

最新更新