带索引实体的房间数据库迁移
Room Database Migration with Indexed Entity
我有 'ImagePendingDBStore' 个实体,我在这个实体中又添加了 4 列(请参阅下面代码中的注释)。在此,一列被索引 'referenceId'
@Entity(tableName = "ImagePendingDBStore",indices = {@Index(value = "referenceId")})
public class ImagePendingDBStore {
@PrimaryKey(autoGenerate = true)
@NonNull
private int ImageId;
private String referenceId;
private Date createdAt;
private Date updatedAt;
private String imageAbsolutePath;
private int synced = 0;
private String customerFirstName;
private String customerMiddleName;
private String customerLastName;
private String dasId;
private String documentName;
private String imageIdRandom;
private int imageResolution;
//new columns
private String dealerId;
private String lat;
private String lng;
private Date imageCaptureDate;
}
我在数据库class中的迁移逻辑如下:
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN dealerId TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN lat TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN lng TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN imageCaptureDate DATE");
database.execSQL("CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)");
}
};
以下是我面临的错误:
Caused by: android.database.sqlite.SQLiteException: index index_ImagePendingDBStore_referenceId already exists (code 1): , while compiling: CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(index index_ImagePendingDBStore_referenceId already exists (code 1): , while compiling: CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId))
#################################################################
正如消息所说 index_ImagePendingDBStore_referenceId 已经存在。
您只需要 4 个 ALTER 语句,因为索引存在,即您没有添加它。因为它已经存在,所以添加 4 列不需要更改索引。
您可以删除该行:-
database.execSQL("CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)");
我有 'ImagePendingDBStore' 个实体,我在这个实体中又添加了 4 列(请参阅下面代码中的注释)。在此,一列被索引 'referenceId'
@Entity(tableName = "ImagePendingDBStore",indices = {@Index(value = "referenceId")})
public class ImagePendingDBStore {
@PrimaryKey(autoGenerate = true)
@NonNull
private int ImageId;
private String referenceId;
private Date createdAt;
private Date updatedAt;
private String imageAbsolutePath;
private int synced = 0;
private String customerFirstName;
private String customerMiddleName;
private String customerLastName;
private String dasId;
private String documentName;
private String imageIdRandom;
private int imageResolution;
//new columns
private String dealerId;
private String lat;
private String lng;
private Date imageCaptureDate;
}
我在数据库class中的迁移逻辑如下:
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN dealerId TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN lat TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN lng TEXT");
database.execSQL("ALTER TABLE ImagePendingDBStore ADD COLUMN imageCaptureDate DATE");
database.execSQL("CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)");
}
};
以下是我面临的错误:
Caused by: android.database.sqlite.SQLiteException: index index_ImagePendingDBStore_referenceId already exists (code 1): , while compiling: CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(index index_ImagePendingDBStore_referenceId already exists (code 1): , while compiling: CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId))
#################################################################
正如消息所说 index_ImagePendingDBStore_referenceId 已经存在。
您只需要 4 个 ALTER 语句,因为索引存在,即您没有添加它。因为它已经存在,所以添加 4 列不需要更改索引。
您可以删除该行:-
database.execSQL("CREATE INDEX index_ImagePendingDBStore_referenceId ON ImagePendingDBStore (referenceId)");