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实现的。