android realm sqlite,关于Realm在android上的使用

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方法就可以了

cb49c4f432edb4fc089f8221e566631e.png高效数据库操作-realm

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值