在Realm数据库迁移期间从旧域中删除数据

时间:2017-02-17 15:20:15

标签: c# xamarin realm realm-migration

所以我需要迁移数据库中的一个模型。我在模型中添加了一个DateTimeOffset字段,其中包含当前在数据库中不存在的Recommendation模型的日期。因此无法从现有数据中填充新字段。

在我的迁移回调中,我想要Recommendation模型及其所有子模型(它由几个类组成)的空白平板。因此,我可以使用新字段从我的web-api中获取一份新的建议数据集。当我尝试清除所有现有模型数据的旧数据库时,我得到一个例外。

  

Realms.Exceptions.RealmInvalidTransactionException

     

无法在只读领域执行交易。

我如何实现上述目标?

这是我的迁移回调的相关代码。

        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");
            });
        };

2 个答案:

答案 0 :(得分:0)

由于您不希望在迁移过程中保留这五个RealmObject的任何数据,RemoveAll来自NewRealm,因为NewRealm中的数据已经可用添加的属性的默认值或已删除的属性的缺失属性。

如果您需要访问“旧”属性并对其执行某种类型的数据转换并使用它更新OldRealm,则您只需要迁移期间的NewRealm数据...

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”

回复:https://github.com/realm/realm-dotnet/issues/1225

答案 1 :(得分:0)

因为@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>();
        };