«

Realm数据库

时间:2024-3-2 18:27     作者:韩俊     分类: Android


Realm Github
Realm官网

Realm是一个移动端用来替代sqlite数据库的解决方案,支持android、ios,支持加密。基础api和示例可以参考官网,以下纪录的是在使用移动数据库时需要考虑的问题。

关于数据库版本升级

默认第一次使用的时候,数据库是无法设置版本号的(默认0),如果更新了实体类,在调用getInstance的时候会抛出异常RealmMigrationNeededException,这时候可以进行捕捉,并调用版本升迁的方法,然后在调用getInstance方法。

import io.realm.Realm;
import io.realm.RealmMigration;
import io.realm.exceptions.RealmMigrationNeededException;

import java.io.File;
import java.util.Random;

import android.content.Context;

public class RealmHelper {

    public static Realm getInstance(Context ctx) {
        // 加密密匙
        byte[] key = new byte[64];
        new Random(1234567890).nextBytes(key);

        Realm realm = null;
        try {
            realm = Realm.getInstance(ctx, key);
        } catch (RealmMigrationNeededException e) {
            Realm.migrateRealmAtPath(new File(ctx.getFilesDir(), "default.realm").getAbsolutePath(),  new RealmMigration() {

                @Override
                public long execute(Realm realm, long version) {

                    // version 0
                    if (0 == version) {
                        // do some change
                        version ++;
                    }

                    return version;
                }
            });
            realm = Realm.getInstance(ctx, key);
        }

        return realm;
    }

}

第一次升级的时候,版本号是0,需要记得增加版本号,否则后面会导致版本混乱。

是否支持非空检查或者空字段

Realm中的基础类型不能填入空值,基础类型包括bool/short/int/long/float/double/string/byte[]。所以插入的时候,必须指定值,其它类型(关系引用)可以插入空值。

如何处理主键,是否自增主键(是否线程安全)

Realm使用@PrimaryKey标识主键,不支持自增主键(变相解决了多线程下主键自增可能会重复的问题),可使用唯一的uuid作为主键。

是否支持多线程

支持。

是否支持关系

支持一对多、多对多关系。

是否支持级联删除

不支持,需手动删除关联表纪录。

是否支持批量插入/更新

批量插入和更新是通过json实现的。

标签: android

热门推荐