Realm是一个移动端数据库,专门针对移动APP设计,它底层并不依赖SQLite,有自己的一套存储引擎,Realm是一个类MVCC数据库,每个连接的线程在特定的时刻都有一个数据库的快照。MVCC在设计上采用了和Git一样的源文件管理算法,也就是说你的每个连接线程就好比在一个分支(也就是数据库的快照)上工作,但是你并没有得到一个完整的数据库拷贝。Realm和一些真正的MVCC数据库如MySQL是不同的,Real在某个时刻只能有一个写操作,且总是操作最新的数据版本,不能在老版本操作。
Realm数据库使用了零拷贝技术,这是与CoreData及其他数据库完全不同的地方,通常的数据库操作是这样的,数据存储在磁盘的数据库文件中,我们的查询请求会转换为一系列的SQL语句,创建一个数据库连接。数据库服务器收到请求,通过解析器对SQL语句进行词法和语法语义分析,然后通过查询优化器对SQL语句进行优化,优化完成执行对应的查询,读取磁盘的数据库文件(有索引则先读索引),返回对应的数据内容并存储到内存中,数据还需要序列化成内存可存储的格式,最后数据还要转换成语言层面的类型,比如Objective-C的对象等。而Realm完全不同,它的数据库文件是通过memory-mapped,也就是说数据库文件本身是映射到内存中的,Realm访问文件偏移就好比文件已经在内存中一样(这里的内存是指虚拟内存),它允许文件在没有做反序列化的情况下直接从内存读取,提高了读取效率。
Realm与多线程,零拷贝架构也使得Realm可以自动更新对象和查询。在一个查询中更新对象,在另外一个查询中可以马上读取到更新的内容。多线程同时更新数据也是一样,可以即时更新对象的内容。正是因为对象的自动更新,所以Realm中也是不允许多线程之间的对象共享,因为如果多线程共享Realm对象,会导致数据的不一致性,虽然通过加锁是可以保证数据一致性的,但是会增加开销。因此,在使用Realm的时候,不要在多个线程之间共享对象。如果要在另外一个线程获取同样的数据,请重新执行查询。
Realm的特点是开源、效率高、跨平台,Android、IOS、前端、后台、PC都可以用,使用C++编写。接下来我们正式使用Realm。
在我们的application类中,初始化Realm。
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("realm_demo.realm")
.rxFactory(new RealmObservableFactory())
.schemaVersion(1)
.build();
Realm.setDefaultConfiguration(config);
try {
Realm.migrateRealm(config, new Migration());
} catch (FileNotFoundException ignored) {
// If the Realm file doesn't exist, just ignore.
}
1.首先声明对象,有两种方式,
1)implements RealmModel 并且添加 @RealmClass
@RealmClass
public class UserRealm implements RealmModel {
...
}
2)extends RealmObject
public class UserRealm extends RealmObject {
...
}
RealmObject是自动更新的,比如你将一个数据读取出来后,又做了修改,修改会马上在数据中生效,不需要你再将数据保存到数据库。
注意:不支持主键自增,需要添加主键的话要加@PrimaryKey
2.增删改查的写法
1)增加一条记录
User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("email");
2)查询
RealmResults result2 = realm
.where(User.class) //以where表示条件的开头
中间表示条件
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")
.findAll(); //以findAll表示条件的结尾
可以不要条件,表示全部查找。也可以将多个连续查询合并,示例如下
RealmResults r2 = realm.where(User.class)
.equalTo("dogs.name", "Fluffy")
.findAll()
.where()
.equalTo("dogs.color", "Brown")
.findAll();
.where()
.equalTo("dogs.color", "Yellow")
.findAll();
一些常用的查找条件,
between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty() & isNotEmpty()
可以查完后排序
RealmResults result = realm.where(User.class).findAll();
result = result.sort("age"); // Sort ascending
result = result.sort("age", Sort.DESCENDING);
可以查完后进行求和,求最大最小,求平均
RealmResults results = realm.where(User.class).findAll();
long sum = results.sum("age").longValue();
long min = results.min("age").longValue();
long max = results.max("age").longValue();
double average = results.average("age");
long matches = results.size();
3)删除记录,搜索出需要删除的记录后调用
final RealmResults results = getUsers();
results.deleteFromRealm(0);
results.deleteFirstFromRealm();
results.deleteLastFromRealm();
results.deleteAllFromRealm();
4)修改记录,直接查完后调用set方法就可以了
高效数据库操作-realm
举报/反馈