daoAndroid技术知识android技术专栏

realm基本使用方法

2017-06-21  本文已影响74人  我想成为创业者

一.什么是realm

Realm作为一款移动端的NoSQL框架,官方定位就是替代SQLite等关系型数据库,它不是基于SQLite的ORM,它是基于C++存储引擎,Realm中的数据对象是自动更新的, 对象一旦被查询出来, 后续发生的任何数据改变也会立即反映在结果中, 不需要刷新对象.


二.为什么使用realm(优势)

  1. 跨平台:兼顾iOS和Android两个平台同时开发;
  2. ** 简单易用:**Ream不是在SQLite基础上的ORM,它有自己的数据查询引擎,十分容易使用。
  3. 快速:比任何的ORM速度都快很多,甚至比SLite速度都要快;
  4. ** 高级:**Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性
  5. 可视化:Realm提供了一个轻量级的数据库查看工具,在Mac Appstore可以下载“Realm Browser”这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。

三.怎样使用realm

  1. 在项目的根build.gradle的文件中添加:
    classpath"io.realm:realm-gradle-plugin:x.x.x"(引用最新的)
  2. 在app的build.gradle文件中添加
    apply plugin:'realm-android'
  3. 在Application的oncreate中初始化
    Realm.init(this);
  4. Model类继承RealmObject
    public class User extends RealmObject{ private RealmList<UserModel> managerList;//list使用 }

注意:RealmList的getter永远也不会返回null, 它只会返回一个为空的list,把这个字段设置为null可以清空这个list.
  1. 有主键copyToRealm()需要替换为copyToRealmOrUpdate()这个方法,它必须是String或整型或它们装箱类型,前者遇到主键冲突时会崩溃, 后者遇到主键冲突会更新已有对象.;
  2. 有主键的对象创建的时候不能使用createObject(Classclazz)方法, 而应该使用createObject(Classclazz, Object primaryKeyValue)附上主键.
    (主键, 只能有一个, 默认加索引@Index但是默认没有加@Required, 如果主键要求非null, 需要显式添加@Required)
  1. 添加或更新
    /**
     * update (更新指定某个)
     */
    public void updateDog(String id, String newName) {
        Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
        mRealm.beginTransaction();
        if (dog != null) {
            dog.setName(newName);
        }
        mRealm.commitTransaction();
    }

    /**
     * update(更新)
     * copyToRealmOrUpdate:如果某个主键存在数据就会更新,该主键不存在就会增加(需要添加@PrimaryKey主键) ;
     * 当主键相同时findFirst和 findAll都是获取一组数据
     * copyToRealm 不能设置主键,一直是添加(没有更新)
     */
    public void updateDog(Dog dog) {
        mRealm.beginTransaction();
        mRealm.copyToRealmOrUpdate(dog);
        mRealm.commitTransaction();
    }
  1. 删除
    /**
     * delete (删除指定某个)
     */
    public void deleteDog(String id) {
        Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
        mRealm.beginTransaction();
        if (dog != null) {
            dog.deleteFromRealm();
        }
        mRealm.commitTransaction();
    }

    /**
     * delete (删除所有)
     */
    public void deleteDog() {
        mRealm.beginTransaction();
        mRealm.delete(Dog.class);  //删除所有登录
        mRealm.commitTransaction();
    }
  1. 查询
    /**
     * query (根据Id主键查)
     */
    public Dog queryDogById(String id) {
        Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
        if (dog == null)
            return null;
        return mRealm.copyFromRealm(dog);
    }

    /**
     * query (查询所有)
     */
    public List<Dog> queryAllDog() {//Sort.DESCENDING降序
        RealmResults<Dog> dogs = mRealm.where(Dog.class).findAll().sort("id", Sort.ASCENDING);
        return mRealm.copyFromRealm(dogs);
    }

    /**
     * 迭代query是否存在
     */
    public boolean queryNewsId(int id) {
        RealmResults<Dog> results = mRealm.where(Dog.class).findAll();
        for(Dog item : results) {
            if(item.getId() == id) {
                return true;
            }
        }
        return false;
    }
  1. Notifications
    /**
     * 添加一个listener, 在数据改变的时候收到更新.
     */
    private void setNotifications() {
        RealmResults<Dog> dogs = realm.where(Dog.class).findAllAsync();
        realmListener = new RealmChangeListener() {
            @Override
            public void onChange(Object o) {
                //do something with the updates
            }
        };
        realm.addChangeListener(realmListener);
    }
    /**
     * 注意listener需要在不用的时候删除
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.removeChangeListener(realmListener);//删除某个listener
//      realm.removeAllChangeListeners();删除所有的listeners
        realm.close();
    }
  1. 异步
private void setAsync() {
        addTask = realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {

            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (addTask != null && !addTask.isCancelled()) {
            addTask.cancel();
        }
    }

常见方法汇总

     
        results.deleteFirstFromRealm();
        results.deleteLastFromRealm();
        results.deleteAllFromRealm();
        results.deleteFromRealm(position);
        mRealm.where(Dog.class).findAll().sum("age").intValue(); //查询总年龄
        mRealm.where(Dog.class).findAll().max("age").intValue();//查询最大年龄
        mRealm.where(Dog.class).findAll().min("age").longValue();
        mRealm.where(Dog.class).findAll().average("age");  //查询平均年龄
        RealmResults<Dog> results = mRealm.where(Dog.class)
                .between("age", 7, 9)
                .or()
                .contains("", "")
                .or()
                .beginsWith("name", "Person")
                .findAll()
                .sort("id", Sort.ASCENDING);
        RealmResults<Dog> sortedPersons = mRealm.where(Dog.class).findAllSorted("age", Sort.DESCENDING);
        mRealm.cancelTransaction();
上一篇下一篇

猜你喜欢

热点阅读