apk更新后如何在领域中更新初始数据?

时间:2019-03-22 16:44:49

标签: android realm

在应用程序中,存在一个领域数据库,其中包含初始数据和用户添加的数据。即使在更新后,用户添加的数据也应保留在设备上。初始数据通过

类添加
public class RealmInitialData implements Realm.Transaction {

    @Override
    public void execute(Realm realm){
     //initial data
        Items item = new Items();
        item.setName("Fragrance");
        item.setTimestamp(System.currentTimeMillis());
        realm.insertOrUpdate(item);
    }
    @Override
    public int hashCode() {
        return RealmInitialData.class.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return obj != null && obj instanceof RealmInitialData;
    }
}

配置(位于扩展Application类的类中)如下所示:

RealmConfiguration realmConfig = new RealmConfiguration.Builder()
                .name("tasky.realm")
                .schemaVersion(2)
                .migration(new Migration())
                .initialData(new RealmInitialData())
                .build();

如果我更改/添加了RealmInitialData中的某些内容以进行更新,则用户应用程序上的数据不会更改。如何既更改初始数据(添加或重写某物)又不更改用户数据?

2 个答案:

答案 0 :(得分:0)

您必须实现RealmMigration并将其传递给RealmConfiguration.Builder().migration()。 像这样:

public class RealmMigrationAgent implements RealmMigration
{
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();

        if (oldVersion == 0) {
            schema.get("InventDisableObject").addField("Reason", int.class);
            oldVersion++;
        }

        if (oldVersion == 1) {
            if (!schema.get("ActionObject").hasField("Annual"))
                schema.get("ActionObject").addField("Annual", boolean.class);
            oldVersion++;
        }
        if (oldVersion == 2) {
            if (!schema.get("ActionObject").hasField("Hash"))
                schema.get("ActionObject").addField("Hash", String.class);
            if (!schema.get("ActionObject").hasField("Manual"))
                schema.get("ActionObject").addField("Manual", boolean.class);
            oldVersion++;
        }
        if (oldVersion == 3) {
            if (!schema.get("OutletObject").hasField("Code"))
                schema.get("OutletObject").addField("Code", String.class);
            oldVersion++;
        }
    }
}

为每个新方案版本逐渐添加方案更新。 我可以看到由于迁移原因您有一些类Migration-您可以提供它的代码吗?

答案 1 :(得分:0)

我遇到了同样的问题,我找到了解决方法。例如,如果您的新版本为7,请尝试在SharedRealm.getInstance(config).getSchemaVersion()之前使用Realm.setDefaultConfiguration(config)获取旧版本6,然后可以更新旧版本setDefaultConfiguration之后的旧版本<7的领域数据。可能对您有帮助:

RealmConfiguration config = new RealmConfiguration.Builder()
            .schemaVersion(7)
            .migration(new RealmMigration() {
                @Override
                public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
                    RealmSchema schema = realm.getSchema();
                    if(oldVersion == 6) {
                        schema.get("ImageRealm")
                                .addField("isSelected", Boolean.class, FieldAttribute.REQUIRED)
                                .addField("isLow", Boolean.class, FieldAttribute.REQUIRED);
                        oldVersion++;
                    }
                }
            }).build();

    SharedRealm sharedRealm = SharedRealm.getInstance(config);
    long oldVersion = sharedRealm.getSchemaVersion();

    Realm.setDefaultConfiguration(config);
    long newVersion = Realm.getDefaultInstance().getVersion();

    // 如果有历史记录,更新状态
    if (oldVersion < 7) {
        Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<DocRealmBean> allData = realm.where(DocRealmBean.class).findAll();
                for (DocRealmBean bean : allData) {
                    bean.state = "0";
                }
            }
        });
    }