realm基本使用方法
2017-06-21 本文已影响74人
我想成为创业者
一.什么是realm
Realm作为一款移动端的NoSQL框架,官方定位就是替代SQLite等关系型数据库,它不是基于SQLite的ORM,它是基于C++存储引擎,Realm中的数据对象是自动更新的, 对象一旦被查询出来, 后续发生的任何数据改变也会立即反映在结果中, 不需要刷新对象.
二.为什么使用realm(优势)
- 跨平台:兼顾iOS和Android两个平台同时开发;
- ** 简单易用:**Ream不是在SQLite基础上的ORM,它有自己的数据查询引擎,十分容易使用。
- 快速:比任何的ORM速度都快很多,甚至比SLite速度都要快;
- ** 高级:**Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性
- 可视化:Realm提供了一个轻量级的数据库查看工具,在Mac Appstore可以下载“Realm Browser”这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。
三.怎样使用realm
- 在项目的根build.gradle的文件中添加:
classpath"io.realm:realm-gradle-plugin:x.x.x"
(引用最新的) - 在app的build.gradle文件中添加
apply plugin:'realm-android'
- 在Application的oncreate中初始化
Realm.init(this);
- Model类继承RealmObject
public class User extends RealmObject{ private RealmList<UserModel> managerList;//list使用 }
注意:RealmList的getter永远也不会返回null, 它只会返回一个为空的list,把这个字段设置为null可以清空这个list.
-
主要注解
@Ignore
表示字段不会被存储.
@PrimaryKey
使用主键会对性能产生影响。创建和更新对象将会慢一点,而查询则会变快
- 有主键
copyToRealm()
需要替换为copyToRealmOrUpdate()
这个方法,它必须是String或整型或它们装箱类型,前者遇到主键冲突时会崩溃, 后者遇到主键冲突会更新已有对象.; - 有主键的对象创建的时候不能使用
createObject(Classclazz)
方法, 而应该使用createObject(Classclazz, Object primaryKeyValue)
附上主键.
(主键, 只能有一个, 默认加索引@Index但是默认没有加@Required, 如果主键要求非null, 需要显式添加@Required)
- 基本使用方法
- 添加或更新
/**
* 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();
}
- 删除
/**
* 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();
}
- 查询
/**
* 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;
}
- 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();
}
- 异步
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();