我正在测试会议室迁移,并且在“迁移和验证”步骤中,我得到了一个 java.lang.IllegalStateException:迁移失败。。由于“ primaryKeyPosition
”值错误service_id”列。稍微深入一点,我发现在 Expected 端, actual_visit_id_service_id_primary_key 中的属性具有不同的 pk 索引(1、2),而在已找到侧,两者具有相同的(1,1)
我在已安装的应用程序中签入了表 actual_visit_service 的数据库模式,并且 service_id 列的 pk 为2(如预期的那样)
失败的实体:
@Entity(
tableName = ACTUAL_VISIT_SERVICE_TABLE,
indices = [Index(
value = [ACTUAL_VISIT_SERVICE_SERVICE_ID, ACTUAL_VISIT_SERVICE_ACTUAL_VISIT_ID], unique = true
)],
foreignKeys = [(ForeignKey(
entity = ActualVisitEntity::class,
parentColumns = [ID],
childColumns = [ACTUAL_VISIT_SERVICE_ACTUAL_VISIT_ID],
onDelete = ForeignKey.CASCADE
))],
primaryKeys = [ACTUAL_VISIT_SERVICE_ACTUAL_VISIT_ID, ACTUAL_VISIT_SERVICE_SERVICE_ID]
)
data class ActualVisitServicesEntity(
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_ACTUAL_VISIT_ID)
val actualVisitId: String,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_AMOUNT)
val amount: Double?,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_DURATION)
val duration: Int?,
@ColumnInfo(name = IS_SYNCHRONIZED)
var isSynchronized: Boolean = false,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_HAS_BEEN_PROVIDED)
var hasBeenProvided: Boolean,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_REJECTION_CATEGORY)
var rejectionCategory: String?,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_REJECTION_REASON)
var rejectionReason: String?,
@ColumnInfo(name = ACTUAL_VISIT_SERVICE_SERVICE_ID)
val serviceId: String
) : BaseEntity() {
....
}
迁移:
@JvmField
val MIGRATION_18_TO_19 = object : Migration(18, 19) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE planned_visit ADD COLUMN hint TEXT")
}
}
我得到的错误:
java.lang.IllegalStateException: Migration failed.
Expected:TableInfo{name='actual_visit_services', columns={duration=Column{name='duration', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}, amount=Column{name='amount', type='REAL', affinity='4', notNull=false, primaryKeyPosition=0}, actual_visit_id=Column{name='actual_visit_id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1}, rejection_category=Column{name='rejection_category', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, has_been_provided=Column{name='has_been_provided', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, service_id=Column{name='service_id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=2}, rejection_reason=Column{name='rejection_reason', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, is_synchronized=Column{name='is_synchronized', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[ForeignKey{referenceTable='actual_visits', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[actual_visit_id], referenceColumnNames=[id]}], indices=[Index{name='index_actual_visit_services_service_id_actual_visit_id', unique=true, columns=[service_id, actual_visit_id]}]}
found:TableInfo{name='actual_visit_services', columns={duration=Column{name='duration', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}, amount=Column{name='amount', type='REAL', affinity='4', notNull=false, primaryKeyPosition=0}, actual_visit_id=Column{name='actual_visit_id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1}, rejection_category=Column{name='rejection_category', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, has_been_provided=Column{name='has_been_provided', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, service_id=Column{name='service_id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1}, rejection_reason=Column{name='rejection_reason', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, is_synchronized=Column{name='is_synchronized', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[ForeignKey{referenceTable='actual_visits', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[actual_visit_id], referenceColumnNames=[id]}], indices=null}
正如您在“预期”上看到的那样:
service_id=Column{name= ... primaryKeyPosition=2}
但在“找到”页面上:
service_id=Column{name= ... primaryKeyPosition=1}
我从一开始就使用Room,但是我只是从迁移开始,即以前的数据库版本18和新的版本19。我使用Robolectric
运行常规实体和DAO测试,并且打算进行与迁移测试相同。
为什么组合的主键中的两个属性在迁移的数据库中具有相同的 pk 索引?