version 0.98.7
官方文档
參考文献
- String,NSString
- Int
- Int8,Int16,Int32,Int64
- Float
- Double
- Bool
- NSData
- NSDate
- RealmOptional
- Object
- List
属性声明方式
= nil
注意事项:
- Object仅仅能声明成可选类型.
- List和RealmOptional仅仅能声明成非可选类型.
- 使用var修饰变量,必须要使用dynamic.具体原因请查照)
一对一(To-One Relationships)
一对多(To-Many Relationships)
反向链接(Inverse Relationships / backlink)
加入索引属性,加快查询速度.
索引支持类型
- strings
- integers
- booleans
- NSDate
注意事项
顾名思义当一个数据的内容改变时,它会自己主动更新该数据的全部实例化对象
当数据变化,须要更新界面时,须要配合 [Realm notifications](#Realm notifications) 或 [key-value observation](#key-value observation)实现,兴许会具体描写叙述这2个功能
声明主键之后。对象将被同意查询,更新速度更加高效,而且要求每一个对象保持唯一性。
一旦带有主键的对象被加入到 Realm 之后。该对象的主键将不可改动。
重写 Object.ignoredProperties() 能够防止 Realm 存储数据模型的某个属性。
Realm 将不会干涉这些属性的常规操作。它们将由成员变量(ivar)提供支持,而且您能够轻易重写它们的 setter 和 getter。
全部写入操作(加入,改动,删除)都必须依托一个write transaction.
因为write transaction会占用一定的资源,所以尽量精简write transaction的个数.当队列写入时,仅仅须要一个就write transaction
数据赋值方式:
嵌套赋值方式:
write操作是堵塞操作,假设有一个写操作,那么其它线程的write操作都会被堵塞.
最好是将write操作放在一个单独的线程中.
Typed Updates
Creating and Updating Objects With Primary Keys
update:true Object必须具有PrimaryKeys.否则会报错.
Key-Value Coding
通过查询操作。Realm 将会返回包括 Object 集合的Results实例。Results 的表现和 Array 十分类似,而且包括在 Results 中的对象能够通过索引下标进行訪问。
全部的查询(包括查询和属性訪问)在 Realm 中都是延迟载入的,仅仅有当属性被訪问时。才干够读取相应的数据。也就是说当没有使用数据前,进行多次排序或者过滤都是不须要额外cpu时间的
查询结构不是Copy对象,而是引用对象.所以在Write操作中改动查询数据,是直接改动数据库中的数据.
基本查询语句
条件查询
类似NSPredicate,同一时候支持NSPredicate.
支持的断言类型
- 比較操作数(comparison operand)能够是属性名称或者某个常量,但至少有一个操作数必须是属性名称。
- 比較操作符 ==、<=、<、>=、>、!=, 以及 BETWEEN 支持 int、long、long long、float、double 以及 NSDate 属性类型的比較。比方说 age == 45
- 相等比較 ==以及!=。比方说Results().filter(“company == %@”, company)
- 比較操作符 == and != 支持布尔属性
- 对于 NSString 和 NSData 属性来说。我们支持 ==、!=、BEGINSWITH、CONTAINS 以及 ENDSWITH 操作符。比方说 name CONTAINS ‘Ja’
- 字符串支持忽略大写和小写的比較方式。比方说 name CONTAINS[c] ‘Ja’ ,注意到当中字符的大写和小写将被忽略
- **Realm 支持下面复合操作符:“AND”、“OR” 以及 “NOT”。
比方说 name BEGINSWITH ‘J’ AND age >= 32;
包括操作符 IN。比方说 name IN {‘Lisa’, ‘Spike’, ‘Hachi’}** - ==、!=支持与 nil 比較,比方说 Results().filter(“ceo == nil”)。注意到这仅仅适用于有关系的对象,这里 ceo 是 Company 模型的一个属性
- ANY 比較,比方说 ANY student.age < 21
- 支持复合表达式类型@count, @min, @max, @sum and @avg.比如realm.objects(Company).filter(“employees.@count > 5”)
- 子查询有例如以下限制
- @count is the only operator that may be applied to the SUBQUERY expression
- The SUBQUERY(…).@count expression must be compared with a constant
- Correlated subqueries are not yet supported
结果会自己主动更新
Realm.Configuration.defaultConfiguration = config.直接设置默认配置
假设须要高速切换账户,能够使用一下代码
指定BundleData中的Realm
注意
假设是初始化一个Realm,指定的路径必须是可写的
内存中的Realms,没有保存在磁盘上.
长处:能够高速的訪问数据,而不须要考虑数据持久化的性能开销.内存Realms仅仅会在temp路径里存放几个文件,用来进行线程间数据同步,不会将Realms中不论什么数据写入磁盘中
注意
因为ARC的原因,内存Realms创建的数据必须要有一个强引用,否则会被回收
错误仅仅会发生在第一次创建Realms.假设Realms已经创建,以后不会错误发生.
数据拷贝仅仅能是不同Realms都在同一线程中创建的,否则无法实现数据拷贝
Realms内部处理的辅助文件,对于使用者来说,就是汇报bug的时候,须要一并提交这些文件
- .realm.lock - A lock file for resource locks.
- .realm.log_a, .realm.log_b - Log files for transaction logs.
- .realm.note - A named pipe for notifications.
Realms能够配置仅仅保存特定的Class,除指定的Class外,其它Class一律不存储.
删除本地Realm
Realm在使用的时候,都是强引用,假设须要的话,就用autoreleasepool来包括
假设使用强引用,直接删除也不会有什么影响
这章主要是说怎样使用IOS本地加密,详情查看官方文档.
这一章主要是讲多线程开发,大量写入事务最好是放在其它线程中,以防止UI线程被堵塞
仅仅在一个线程中处理全部事情,不须要操心并发和多线程.(然并卵的话)
Realm在多线程处理上不须要使用线程锁,仅仅须要注意写入操作须要在Write事件中.
Realm为了更好的支持多线程处理,它为每一个线程都创建了一个视图(SQL中的视图概念?
?).因为每一个线程都有自己的snapshots,导致线程之间同步问题.
唯一须要记住的是:你不能在多个线程之间共享同一个Realm对象.假设这种话,就会导致一个线程上改动了数据,其它线程无法同步数据.
在UI线程或者其它加入Runloop的线程上,Realm都会自己主动更新其它线程Runloop的操作结果.(这里是说其它线程有更新,UI线程或Runloop线程都不会更新数据)
在其它类型的线程上操作,都是基于Snapshots.
所以最好的处理方法是,保存唯一的一个视图,这样就不用操心多线程并发的问题.
UI线程或者其它加入Runloop的线程上,数据都会自己主动刷新,除非将Realm.autorefresh设置为NO
其它类型的线程,都是以最后一次改动成功的Realm为snapshot,除非是手动refresh
Realm.commitWrite后,Realm会刷新一次
最好是不要经常性的手动调用refresh(),当你正在刷新,其它线程有其它事务进行处理时,会导致数据”pinned”,进而增大Realm在磁盘上的空间
let queue = dispatch_queue_create(“test”, DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue) {
autoreleasepool {
// Get realm and table instances for this thread
let realm = try! Realm()
}
}
// A Realm Object that represents a city
class City: Object {
dynamic var city = “”
dynamic var id = 0
// other properties left out …
}
// Insert from NSData containing JSON
try! realm.write {
let json = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
realm.create(City.self, value: json, update: true)
}
// Observe Realm Notifications
let token = realm.addNotificationBlock { notification, realm in
viewController.updateUI()
}
// later
token.stop()
// Observe Results Notifications
let token = realm.objects(Person).filter(“age > 5”).addNotificationBlock { results, error in
// results is identical to ‘realm.objects(Person).filter(“age > 5”)’
viewController.updateUI()
}
// later
token.stop()
class Person: Object {
dynamic var firstName = “”
dynamic var lastName = “”
dynamic var age = 0
}
class Person: Object {
dynamic var fullName = “”
dynamic var age = 0
}
Realm.Configuration.defaultConfiguration.schemaVersion = 2;
Realm.Configuration.defaultConfiguration.migrationBlock = {migration, oldSchemaVersion in
if oldSchemaVersion < 1 {
migration.enumerate(Person.className(), { (oldObject, newObject) in
let firstName = oldObject![“firstName”] as! String
let lastName = oldObject![“lastName”] as! String
newObject![“fullName”] = “(firstName) (lastName)”
})
}
Realm.Configuration.defaultConfiguration.schemaVersion = 2;
Realm.Configuration.defaultConfiguration.migrationBlock = {migration, oldSchemaVersion in
if oldSchemaVersion < 10 {
migration.enumerate(Person.className(), { (oldObject, newObject) in
if oldSchemaVersion < 1 {
let firstName = oldObject![“firstName”] as! String
let lastName = oldObject![“lastName”] as! String
newObject![“fullName”] = “(firstName) (lastName)”
}