Realm常用操作封装

Realm是第一个直接针对运行在手机,平板,可穿戴设备设计和开发的数据库;它的数据直接暴露成类对象,通过代码查询,避免了ORM映射的 维护和性能问题。另外,Realm努力保持API只包括4个基础类(Object, Array, Results and Realms)和一个工具类(Migrations),用户可以凭直觉使用,在几分钟内在App中用上realmModern: Realm支持关联,泛型,向量化。

Realm在数据库基本操作上比原生Sqlite还要快,同时又保持更丰富的功能特性集。

下面将结合Java的泛型来实现基本的增删方法,泛型主要是考虑到要使用Realm存储,那此类必须继承自RealmObject或者实现RealmModel,所以可以像下面这样封装:

/**
 * 数据库操作基类
 */
public class BaseDbHelper {
  protected RealmConfiguration mDefaultConfig;
  protected Set<RealmConfiguration> mConfigsList;

  protected BaseDbHelper(String dbName, int dbVersion, Object dbModules){
    mDefaultConfig = new RealmConfiguration.Builder(MzAccountManager.getInstance().getContext())
                .schemaVersion(dbVersion)
                .migration(migration)
                .modules(dbModules)//只存指定modules的类
                .name(dbName)
                .build();
        mConfigsList = new HashSet<RealmConfiguration>();
    }

    protected Realm createRealm() {
        //一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象
        return createRealmByConfig(mDefaultConfig);
    }

    protected Realm createRealmByConfig(RealmConfiguration config){
        mConfigsList.add(config);
        return Realm.getInstance(config);
    }

    /**
     * 添加指定类到数据库
     * @param info
     */
    public void insertRealmObject(RealmObject info){
        Realm realm = createRealm();
        realm.beginTransaction();
        realm.copyToRealmOrUpdate(info);
        realm.commitTransaction();
        realm.close();
    }

    /**
     * 批量插入数据
     * @param infos
     */
    public void insertRealmObjects(List<? extends RealmObject> infos){
        Realm realm = createRealm();
        realm.beginTransaction();
		//要使用update这种方法,那插入的对象必须是有主键的
        realm.copyToRealmOrUpdate(infos);
        realm.commitTransaction();
        realm.close();
    }

    /**
     * 查询指定类的全部存储信息
     * @return
     * @param clazz
     */
    public List<? extends RealmObject> queryRealmObjects(Class<? extends RealmObject> clazz){
        Realm realm = createRealm();
        RealmResults<? extends RealmObject> realmResults = realm.where(clazz).findAll();
        List<? extends RealmObject> arrayList = realm.copyFromRealm(realmResults);
        realm.close();
        return arrayList;
    }

    /**
     * 删除指定类的全部数据库信息
     */
    public void deleteRealmObjects(Class<? extends RealmObject> clazz){
        Realm realm = createRealm();
        realm.beginTransaction();
        realm.delete(clazz);
        realm.commitTransaction();
        realm.close();
    }

    /**
     * 删除此realm对应的全部数据库信息
     */
    public void deleteAllRealmObjects(){
        Realm realm = createRealm();
        realm.beginTransaction();
        realm.deleteAll();
        realm.commitTransaction();
        realm.close();
    }

    /**
     * 升级数据库
     */
    protected RealmMigration migration = new RealmMigration() {//升级数据库
        @Override
        public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

            // DynamicRealm exposes an editable schema
            RealmSchema schema = realm.getSchema();

            if (oldVersion > newVersion) {//数据库降级
                if (mConfigsList != null && mConfigsList.size() > 0) {
                    for (RealmConfiguration config : mConfigsList) {
                        Realm.deleteRealm(config);
                    }
                }
            } else if (oldVersion < newVersion) {//数据库升级

            }
        }
    };
}

感兴趣的同鞋还可以看Realm相关的文章:

文章目录
|