我正在使用Realm v 0.85.0在我的一个项目中尝试我的第一次Realm迁移。我从v 0.84.0迁移,但迁移也适用于早期版本。我已经按照文档中链接的https://github.com/realm/realm-java/tree/master/examples/migrationExample/src/main示例进行了操作。
在此迁移中,我尝试添加两个新表。为了添加每个新表,我的迁移代码如下所示:
public class Migration implements RealmMigration {
@Override
public long execute(Realm realm, long version) {
if (version == 0)
{
Table newTableOne = realm.getTable(NewTableOne.class);
newTableOne.addColumn(ColumnType.STRING, "columnOne");
// Add any other needed columns here and repeat process for NewTableTwo
// Rest of migration logic goes here...
version++;
}
return version;
}
}
根据Migration on Realm 0.81.1,如果表不存在,getTable()方法将自动创建表。我不认为这是问题,但我只是为了完整性而把它包括在内。
我还尝试向现有表添加几个新列,并在这些新列上设置默认值。为此,我使用以下代码:
Table existingTable = realm.getTable(ExistingTable.class);
existingTable.addColumn(ColumnType.BOOLEAN, "newColumnOne");
existingTable.addColumn(ColumnType.INTEGER, "newColumnTwo");
// Any other new columns needed here
long newColumnOneIndex = getIndexForProperty(existingTable, "newColumnOne");
long newColumnTwoIndex = getIndexForProperty(existingTable, "newColumnTwo");
for (int i = 0; i < existingTable.size(); i++)
{
userTable.setBoolean(newColumnOneIndex, i, false);
userTable.setLong(newColumnTwoIndex, i, 5);
}
直接从Github上的示例中提取getIndexForProperty方法,如下所示:
private long getIndexForProperty(Table table, String name) {
for (int i = 0; i < table.getColumnCount(); i++) {
if (table.getColumnName(i).equals(name)) {
return i;
}
}
return -1;
}
运行此迁移时,我收到RealmMigrationNeededException,指出“字段数不匹配 - 预计22但是23”。我查看了StackOverflow,并通过Google和Github维基进行了一些研究,但未能找到与此确切“字段数不匹配”消息相关的任何信息。
我确保每个模型类中的每个新字段都有一个addColumn行,我的模型中没有比添加列更多的字段,反之亦然。
非常感谢您提供的任何帮助。