迁移期间Realm数据库插入行

时间:2020-09-21 20:19:06

标签: android migration realm

我的迁移类很小,因此在应用启动时,我不会创建带有一些预定义行的SportTypes表。我尝试了使用迁移方法评论的解决方案,但是没有机会。

  public class SportTypes extends RealmObject {
        @PrimaryKey
        private Integer id;
        private String name;
        private RealmList<SportTypes> sportTypes;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public RealmList<SportTypes> getSportTypes() {
            return sportTypes;
        }
    
        public void setSportTypes(RealmList<SportTypes> sportTypes) {
            this.sportTypes = sportTypes;
        }
    }


public class RealmMigrations implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
    
        RealmSchema schema = realm.getSchema();
        schema.create("SportTypes")
                .addField("id", Integer.class, FieldAttribute.PRIMARY_KEY)
                .addField("name", String.class);
            
    //        schema.get("SportTypes")
//                .transform(new RealmObjectSchema.Function() {
//                    @Override
//                    public void apply(DynamicRealmObject obj) {
//                        Realm realm = Realm.getDefaultInstance();
//                        realm.beginTransaction();
//                        SportTypes sport = realm.createObject(SportTypes.class);
//                        sport.setId(0);
//                        sport.setName("cycling");
//                        sport.getSportTypes().add(sport);
//                        realm.commitTransaction();
//                        realm.close();
//                    }
//                });
//        schema.get("SportTypes").transform(new RealmObjectSchema.Function() {
//            @Override
//            public void apply(DynamicRealmObject obj) {
//                obj.setInt("id", 0);
//                obj.setInt("id", 1);
//                obj.setInt("id", 2);
//                obj.setInt("id", 3);
//                obj.setInt("id", 4);
//                obj.setString("name", "Running");
//                obj.setString("name", "Cycling");
//                obj.setString("name", "Swimming");
//                obj.setString("name", "IndoorRunning");
//                obj.setString("name", "IndoorCycling");
//            }
//        });

// Deliberately not using old version to run upper lines
        if (oldVersion == 0) {
            oldVersion++;
        }
    }
}

我在活动的onCreate方法中调用以下部分。我还手动更改版本以触发迁移类的迁移事件,但无法获得任何行。

Realm.init(this);
        final RealmConfiguration configuration = new RealmConfiguration.Builder().name("sports1761.realm").schemaVersion(1).migration(new RealmMigrations()).build();
        Realm.setDefaultConfiguration(configuration);
//        try {
//            Realm.migrateRealm(configuration);
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }
        Realm realm = Realm.getDefaultInstance();
        RealmObjectSchema schema = realm.getSchema().get("SportTypes");
        final RealmResults<SportTypes> sports = realm.where(SportTypes.class).findAll();
        Integer size = sports.size();

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。您应该先获取架构并创建DynamicRealmObject并删除旧记录,然后再添加新记录,然后再添加新记录。如果对象具有主键,则应使用createObject方法的字段和主键重载来创建对象。

public class RealmMigrations implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        if (oldVersion == 0) {
            RealmSchema schema = realm.getSchema();
            RealmObjectSchema sportTypesSchema = schema.get("SportTypes");
            realm.delete("SportTypes");
            DynamicRealmObject sportType = realm.createObject("SportTypes", 0);
            sportType.setString("name", "Running");
            DynamicRealmObject sportType1 = realm.createObject("SportTypes", 1);
            sportType.setString("name", "Cycling");
            DynamicRealmObject sportType2 = realm.createObject("SportTypes", 2);
            sportType.setString("name", "Swimming");
            DynamicRealmObject sportType3 = realm.createObject("SportTypes", 3);
            sportType.setString("name", "Indoor Running");
            DynamicRealmObject sportType4 = realm.createObject("SportTypes", 4);
            sportType.setString("name", "Indoor Cycling");
            RealmList<DynamicRealmObject> listItems = sportType.getList("sportTypes");
            List<DynamicRealmObject> values = Arrays.asList(sportType, sportType1, sportType2, sportType3, sportType4);
            listItems.addAll(values);
            oldVersion++;
        }
    }
}
相关问题