Realm数据库使用教程(六):数据迁移

数据迁移
数据迁移前的数据Model

package tsou.com.simple.realmtest.bean;

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;

/**
 * Created by Administrator on 2017/12/19 0019.
 */

public class MigrationPerson extends RealmObject {
    @PrimaryKey
    private int id;
    @Required
    private String name;
    private int age;
    private String sex;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }    public void setSex(String sex) {
        this.sex = sex;
    }
}


在数据库中添加数据

//数据迁移前添加数据
                mRealm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        for (int i = 0; i < 10; i++) {
                            MigrationPerson person = new MigrationPerson();
                            person.setId(i);
                            person.setName("huangxiaoguo" + i);
                            person.setAge(new Random().nextInt(500));
                            if (i % 2 == 0) {
                                person.setSex("男");
                            } else {
                                person.setSex("女");
                            }
                            realm.copyToRealmOrUpdate(person);
                        }

                    }
                });


添加的数据如下图:


更改后的Model

package tsou.com.simple.realmtest.bean;

import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.Required;

/**
 * Created by Administrator on 2017/12/19 0019.
 */

public class MigrationPerson extends RealmObject {
    //    @PrimaryKey //取消
    private int id;
    @Required
    private String name;

//    private int age;
    /**
     * 重命名age字段
     */
    private int myage;
    /**
     * 移除sex字段
     */
//    private String sex;

    /**
     * 下面是新增字段
     */
    private int num;
    private String project;
    private Men men;
    private RealmList<Men> mens;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMyage() {
        return myage;
    }

    public void setMyage(int myage) {
        this.myage = myage;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    public Men getMen() {
        return men;
    }

    public void setMen(Men men) {
        this.men = men;
    }

    public RealmList<Men> getMens() {
        return mens;
    }    public void setMens(RealmList<Men> mens) {
        this.mens = mens;
    }
}


创建CustomMigration(根据新旧字段变化进行逻辑编写)

package tsou.com.simple.realmtest.migration;

import io.realm.DynamicRealm;
import io.realm.DynamicRealmObject;
import io.realm.RealmMigration;
import io.realm.RealmObjectSchema;
import io.realm.RealmSchema;

/**
 * Created by Administrator on 2017/12/19 0019.
 * 数据迁移
 */public class CustomMigration implements RealmMigration {
    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 0 && newVersion == 1) {
            schema.get("MigrationPerson")
                    .removePrimaryKey()//去除主键标志
                    .removeField("sex")//删除sex字段
                    .renameField("age", "myage")//更改age字段为myage字段
                    .addField("num", int.class)//添加num字段int类型
                    .addField("project", String.class)//添加project字段int类型,
//                    .addField("id", long.class, FieldAttribute.PRIMARY_KEY)//使用三个参数的,可设置注释属性
                    .addRealmObjectField("men", schema.get("Men"))//添加对象
                    .addRealmListField("mens", schema.get("Men"))//添加集合对象
                    .transform(new RealmObjectSchema.Function() {
                        @Override
                        public void apply(DynamicRealmObject obj) {
                            DynamicRealmObject men = realm.createObject("Men");
                            men.set("name", "迁移Men");
                            men.set("age", 8);
                            obj.setObject("men", men);//初始化值的操作
                            obj.getList("mens").add(men);
                        }
                    });
             //注意这里要++,因为Realm不会自动为其增加
            oldVersion++;
        }
    }
}


更改Realm初始配置

package tsou.com.simple.realmtest;

import android.app.Application;
import android.content.Context;

import com.facebook.stetho.Stetho;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider;

import java.security.SecureRandom;

import io.realm.Realm;
import io.realm.RealmConfiguration;
import tsou.com.simple.realmtest.migration.CustomMigration;
import tsou.com.simple.realmtest.utils.UIUtils;

/**
 * Created by Administrator on 2017/12/15 0015.
 */

public class MyApplication extends Application {

    /**
     * 上下文
     */
    private static MyApplication instance;
    private static RealmConfiguration config;
    private static String key = "huangxiaoguo1234";

    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * 在Realm中Stetho需要配置
         */
        Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
                        .build());

        Realm.init(this);
        instance = this;
        new SecureRandom().nextBytes(UIUtils.getRealmKey(key));
        config = new RealmConfiguration.Builder()
                .name("huangxiaoguo.realm")//指定数据库的名称。如不指定默认名为default。
//                .encryptionKey(UIUtils.getRealmKey(key))//指定数据库的密钥。
                .schemaVersion(1)
//                .deleteRealmIfMigrationNeeded()//声明版本冲突时自动删除原数据库,开发时候打开
                .migration(new CustomMigration())//指定迁移操作的迁移类。
//                .inMemory()// 声明数据库只在内存中持久化
                .build();

//        mRealm = Realm.getDefaultInstance();
//        mRealm = Realm.getInstance(config);
    }

    public static Context getInstance() {
        return instance;
    }

    public static RealmConfiguration getRealmConfiguration() {
        return config;
    }

}


注意:不要忘记升级数据库schemaVersion

重新运行程序


升级完成!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值