Realm Swift

   日期:2024-12-26    作者:shantao19860517 移动:http://ljhr2012.riyuangf.com/mobile/quote/33673.html
Realm Swift


version 0.98.7

官方文档
參考文献

Realm Swift

  • String,NSString
  • Int
  • Int8,Int16,Int32,Int64
  • Float
  • Double
  • Bool
  • NSData
  • NSDate
  • RealmOptional
  • Object
  • List

属性声明方式

Type Non-optional Optional 声明类型 非可选类型声明方式 可选类型声明方式 Bool dynamic var value = false let value = RealmOptional() Int dynamic var value = 0 let value = RealmOptional() Float dynamic var value:Float = 0.0 let value = RealmOptional() Double dynamic var value:Double = 0 let value = RealmOptional() String dynamic var value = “” dynamic var value: String?

= nil

Data dynamic var value = Data() dynamic var value: NSData? = nil Date dynamic var value = Date() dynamic var value: Date? = nil Object n/a: must be optional dynamic var value: Class?

List let value = List n/a: must be non-optional
注意事项:
  • 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)”
}








 

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号