android - 房间数据库错误 : Migration didn't properly handle

标签 android sqlite android-sqlite android-room android-database

我想为我的数据库应用程序使用 Room 库。 我想从 Assets 文件夹中打开一个数据库并获取所有行。

我用这种方式打开数据库: https://github.com/humazed/RoomAsset .

错误:

    java.lang.IllegalStateException: Migration didn't properly handle quiz(com.example.user.testroomlibrary3.Quiz).
 Expected:
TableInfo{name='quiz', columns={quiz_date=Column{name='quiz_date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, class_id=Column{name='class_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, quiz_name=Column{name='quiz_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
 Found:
TableInfo{name='quiz', columns={class_id=Column{name='class_id', type='int', affinity='3', notNull=false, primaryKeyPosition=1}, quiz_date=Column{name='quiz_date', type='date', affinity='1', notNull=false, primaryKeyPosition=0}, quiz_name=Column{name='quiz_name', type='nvarchar(50)', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

我的代码:

主要内容:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final AppDatabase db = AppDatabase.getAppDatabase(MainActivity.this);

    new Thread(new Runnable() {
        @Override
        public void run() {
            List<Quiz> quizList = db.quizDao().getAll();
            Log.d("Main", "list = " + quizList);
        }
    }).start();
}

测验:

@Entity(tableName = "quiz")
public class Quiz {

    @PrimaryKey
    @ColumnInfo(name = "class_id")
    private int id;

    @ColumnInfo(name = "quiz_name")
    private String name;

    @ColumnInfo(name = "quiz_date")
    private String date;
}

测验道:

@Dao
public interface QuizDao {
    @Query("SELECT * FROM quiz")
    List<Quiz> getAll();
}

应用程序数据库:

public abstract class AppDatabase extends RoomDatabase {

private static AppDatabase INSTANCE;

public abstract QuizDao quizDao();

public static AppDatabase getAppDatabase(Context context)
{
    if(INSTANCE == null)
    {
        INSTANCE = RoomAsset.databaseBuilder(context.getApplicationContext() ,
                AppDatabase.class , "TEST.db").build();
    }
    return INSTANCE;
}
}

表查询:

CREATE TABLE quiz(
    class_id int primary key,
    quiz_name nvarchar(50) ,
    quiz_date date);

最佳答案

问题在于 Room 期望表中的列具有特定的列类型。

那些是 INTEGER、TEXT、BLOB 或 REAL(使用哪一个取决于列的实体中定义的 java 类型)。

这样说它期望:-

quiz_name=Column{name='quiz_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}

但发现:-

quiz_name=Column{name='quiz_name', type='nvarchar(50)', affinity='2', notNull=false, primaryKeyPosition=0}

这是说它期望使用 TEXT 而不是 nvarchar(50)。

因此,您需要将复制到 Assets 文件夹中的表转换为使用列定义:-

quiz_name TEXT 

关于android - 房间数据库错误 : Migration didn't properly handle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202635/

相关文章:

Android:检索服务中的 Intent 数据?

java - 在 Canvas 中绘制可绘制不起作用

android - 将 Activity 用作对话框

android - React native gradlew assembleRelease 构建失败。任务 ':app:mergeReleaseResources' 执行失败

android - 在android中升级Sqlite数据库?

android.database.sqlite.SQLiteConstraintException : FOREIGN KEY constraint failed (Sqlite code 787 SQLITE_CONSTRAINT_FOREIGNKEY)

Android SQLite 替代品

SQL:在一条语句中插入多组值?

android - SQLite 的 "NO ACTION"外键约束到底做了什么,它与 "RESTRICT"有何不同?

c# - Sqlite数据库是否支持波斯/阿拉伯语编码?