在 Realm 数据库迁移期间从旧领域中删除数据
Remove data from old realm during Realm database migration
所以我现在需要迁移数据库中的一个模型。我已将 DateTimeOffset
字段添加到模型中,该字段将包含我的 Recommendation
模型的日期,该日期目前在数据库中不存在。因此无法从现有数据填充新字段。
在我的迁移回调中,我想要 Recommendation
模型及其所有子模型(它由几个 类 组成)的空白板。因此,我可以使用新字段从我的 web-api 中获取新的推荐数据集。当我尝试清除所有现有模型数据的旧数据库时,出现异常。
Realms.Exceptions.RealmInvalidTransactionException
Can't perform transactions on read-only Realms.
如何实现上述目标?
这是我的迁移回调的相关代码。
var config = new RealmConfiguration("salt.realm");
config.SchemaVersion = 2;
config.MigrationCallback = (migration, oldSchemaVersion) =>
{
Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;
migration.OldRealm.Write(() =>
{
migration.OldRealm.RemoveAll("RecDataString");
migration.OldRealm.RemoveAll("RecChart");
migration.OldRealm.RemoveAll("RecSummary");
migration.OldRealm.RemoveAll("RecTickerSymbol");
migration.OldRealm.RemoveAll("Recommendation");
});
};
由于您不希望在迁移过程中保留这五个 RealmObject
的任何数据,因此 NewRealm
中的 RemoveAll
因为数据已经在 NewRealm 中可用使用添加属性的默认值或删除属性的缺失值。
如果您需要访问 "old" 属性并对其执行某种类型的数据转换并使用它更新 NewRealm
,则在迁移期间只需要 OldRealm
数据。 .
migration.NewRealm.RemoveAll<POCO>();
await UpdateRecommendationFromYourWebApi();
注意:由于您要添加 DateTimeOffset
,因此您可能需要注意将默认值设置为“1/1/1970 12:00:00 AM +00”的当前错误: 00" 与 "1/1/0001 12:00:00 AM +00:00"
正如@SushiHangover 正确指出的那样,我应该在 newRealm 而不是 oldRealm 上操作。因为我关心删除新领域的 RealmObjects。
不需要写入事务,因为 config.MigrationCallback
本身已经是一个写入事务。
我无法让 RemoveAll("className")
工作它抛出异常,这是我目前的工作解决方案。
var config = new RealmConfiguration("salt.realm");
config.SchemaVersion = 1;
config.MigrationCallback = (migration, oldSchemaVersion) =>
{
Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;
migration.NewRealm.RemoveAll<Recommendation>();
migration.NewRealm.RemoveAll<RecDataString>();
migration.NewRealm.RemoveAll<RecChart>();
migration.NewRealm.RemoveAll<RecSummary>();
migration.NewRealm.RemoveAll<RecTickerSymbol>();
};
所以我现在需要迁移数据库中的一个模型。我已将 DateTimeOffset
字段添加到模型中,该字段将包含我的 Recommendation
模型的日期,该日期目前在数据库中不存在。因此无法从现有数据填充新字段。
在我的迁移回调中,我想要 Recommendation
模型及其所有子模型(它由几个 类 组成)的空白板。因此,我可以使用新字段从我的 web-api 中获取新的推荐数据集。当我尝试清除所有现有模型数据的旧数据库时,出现异常。
Realms.Exceptions.RealmInvalidTransactionException
Can't perform transactions on read-only Realms.
如何实现上述目标?
这是我的迁移回调的相关代码。
var config = new RealmConfiguration("salt.realm");
config.SchemaVersion = 2;
config.MigrationCallback = (migration, oldSchemaVersion) =>
{
Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;
migration.OldRealm.Write(() =>
{
migration.OldRealm.RemoveAll("RecDataString");
migration.OldRealm.RemoveAll("RecChart");
migration.OldRealm.RemoveAll("RecSummary");
migration.OldRealm.RemoveAll("RecTickerSymbol");
migration.OldRealm.RemoveAll("Recommendation");
});
};
由于您不希望在迁移过程中保留这五个 RealmObject
的任何数据,因此 NewRealm
中的 RemoveAll
因为数据已经在 NewRealm 中可用使用添加属性的默认值或删除属性的缺失值。
如果您需要访问 "old" 属性并对其执行某种类型的数据转换并使用它更新 NewRealm
,则在迁移期间只需要 OldRealm
数据。 .
migration.NewRealm.RemoveAll<POCO>();
await UpdateRecommendationFromYourWebApi();
注意:由于您要添加 DateTimeOffset
,因此您可能需要注意将默认值设置为“1/1/1970 12:00:00 AM +00”的当前错误: 00" 与 "1/1/0001 12:00:00 AM +00:00"
正如@SushiHangover 正确指出的那样,我应该在 newRealm 而不是 oldRealm 上操作。因为我关心删除新领域的 RealmObjects。
不需要写入事务,因为 config.MigrationCallback
本身已经是一个写入事务。
我无法让 RemoveAll("className")
工作它抛出异常,这是我目前的工作解决方案。
var config = new RealmConfiguration("salt.realm");
config.SchemaVersion = 1;
config.MigrationCallback = (migration, oldSchemaVersion) =>
{
Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;
migration.NewRealm.RemoveAll<Recommendation>();
migration.NewRealm.RemoveAll<RecDataString>();
migration.NewRealm.RemoveAll<RecChart>();
migration.NewRealm.RemoveAll<RecSummary>();
migration.NewRealm.RemoveAll<RecTickerSymbol>();
};