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