如何使用空间从没有主键的表中迁移?

时间:2018-04-12 11:37:45

标签: android database sqlite android-room

我正在尝试迁移到房间,但我的桌子的架构是这样的:

CREATE TABLE cache(key text, content text, time integer);

实体:

@Entity(tableName = "cache")
public class Cache{
    public Integer id;
    public String key;
    public String content;
    public Integer time;
}

没有明确声明主键,构建时会出错:

An entity must have at least 1 field annotated with @PrimaryKey

我尝试将主键添加到表中,但似乎sqlite不支持,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

摘自此处:http://www.sqlitetutorial.net/sqlite-primary-key/

与其他数据库系统(如MySQL,PostgreSQL等)不同,您不能使用ALTER TABLE语句将主键添加到现有表中。

要解决此问题,您需要:

  • 设置外键检查
  • 将表重命名为另一个表名(old_table)
  • 创建一个新表(表),其中包含您已重命名的表的确切结构
  • 将数据从old_table复制到表格
  • 打开电源 外键检查

答案 1 :(得分:0)

我测试了代码,您可以使用迁移规则在现有数据库中添加新列

迁移规则

 static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(android.arch.persistence.db.SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE cache ADD COLUMN id INTEGER primary KEY AUTOINCREMENT");
        }
    };

将MigrationRule添加到Room数据库

Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
        .addMigrations(MIGRATION_1_2)
        .allowMainThreadQueries()
        .build();

新的入门课程是

@Entity(tableName = "cache")
public class Cache{
    @PrimaryKey(autoGenerate = true)
    public Integer id;
    public String key;
    public String content;
    public Integer time;
}

别忘了房间数据库版本是SQLite db version + 1