- Realm:
是我们对数据库的称谓:它包含多个不同的对象,并对应磁盘中的一个文件。
Realm.getInstance(this)来访问我们已初始化的realm变量。该静态方法会为你的当前线程返回一个Realm实例,它对应了您Context.getFilesDir()目录中的default.realm文件。
默认情况下的Realm使用内部存储(internal storage),您的应用并不需要取得任何读写权限。一般来说,这个文件位于/data/data/<packagename>/files/。
可以通过realm.getPath()来获得该Realm的绝对路径。
Realm的实例是线程单例化的,也就是说,在同一个线程内多次调用静态方法获得针对同路径的Realm,会返回同一个Realm实例。
- RealmConfiguration
使用 builder 模式构造实例:
name(String filename): 文件名
encryptionKey(byte[] key):加密
schemaVersion(long schemaVersion): 版本号。如果版本号比现有的高,必须提供一个 migration,否则抛异常
migration(RealmMigration migration): 迁移
deleteRealmIfMigrationNeeded():不再抛异常,直接删除以前的数据构造版本号,会造成数据丢失。
inMemory(): 内存数据库,停止后数据删除。
- Realm方法简析:
createAllFromJson(Class<E> clazz, JSONArray json): 从 Json 数组中创建 Realm 对象,必须在一个事务中进行。
createObject(Class<E> clazz):向 Realm中实例化并添加一个对象。
copyToRealm(E object): 向 Realm 中copy 一个对象。以后原始对象改变,不会影响 copy的部分,这是个深层 copy,所有被引用的对象都会被 copy。
copyToRealmOrUpdate(E object):
copyToRealm(Iterable<E> objects)
copyFromRealm(Iterable<E> realmObjects):深层 copy,
RealmQuery<E> where(Class<E> clazz) :用于查询
allObjects(Class<E> clazz):返回所有对象。
clear(Class<? extends RealmObject> clazz): 清除指定类的所有对象。
字段类型
Realm支持以下字段类型:boolean、byte、short、int、long、float、double、String、Date和byte []。整数类型short,int和long都被映射到realm内的相同类型(实际上为long)。再者,还可以使用RealmObject的子类和RealmList<? extends RealmObject>来表示模型关系。
Realm对象中还可以声明包装类型(boxed type)属性,包括:Boolean、Byte、Short、Integer、Long、Float和Double。通过使用包装类型,可以使这些属性存取空值(null)。@Required 修饰类型和空值(null)
某些时候,空值(null)对于属性并不合适。这时可以使用注解@Required告诉Realm强制禁止空值(null)被存储。基本数据类型(primitive types)不需要使用注解@Required,因为他们本身就不可为空。忽略的属性
注解@Ignore意味着一个字段不应该被保存到Realm。某些时候输入的信息包含比模型更多的字段,而您不希望处理这些未使用的数据字段,您可以用@Ignore来标识这些您希望被Realm忽略的字段。主键
@PrimaryKey可以用来定义字段为主键,该字段类型必须为字符串或整数(short、int或long)。不可以存在多个主键。使用支持索引的属性类型作为主键同时意味着为该字段建立索引。
主键不可被赋予空值(null),使用@PrimaryKey时即同时隐式声明了@Required。
- 事务
在任何时间都可以对对象进行访问和查询
所有的写操作(添加、修改和删除对象),必须包含在写入事务(transaction)中。
当您在写入事务内处理Realm对象时,您可能会遇到想要放弃更改的情况。您可以简单地取消写入事务:realm.beginTransaction();
User user = realm.createObject(User.class);
// ...
ralm.cancelTransaction();
写入事务之间会互相阻塞,如果一个写入事务正在进行,那么其他的线程的写入事务就会阻塞它们所在的线程。
由但得益于 Realm 的 MVCC 架构,当正在进行一个写入事务时读取操作并不会被阻塞!
写入
当使用realm.copyToRealm()时,请注意只有返回的对象是由Realm管理的,这非常重要。对原始对象(Standalone Object)的任何改变都不会写入Realm.事务执行块(Transaction blocks)
除手动调用realm.beginTransaction()、realm.commitTransaction()和realm.cancelTransaction()之外你可以使用realm.executeTransaction()方法,它会自动处理写入事物的开始和提交,并在错误发生时取消写入事物。
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("john@corporation.com");
}
});查询
Realm 中的所有读取(包括查询)操作都是延迟执行的,且数据绝不会被拷贝。查询条件:
Realm支持以下查询条件:
between、greaterThan()、lessThan()、greaterThanOrEqualTo()和lessThanOrEqualTo()
equalTo()和notEqualTo()
contains()、beginsWith()和endsWith()
并非所有条件都适用于所有数据类型,具体请参考RealmQuery API。