Realm
是一个移动端的数据库,Realm
是SQLite
和CoreData
的替代者。它可以节省你成千上万行代码和数周的工作,并且让你精巧的制作出令人惊叹的用户体验。
文档版本 0.93.2
在github上获取
需求:
iOS7以上 OS X10.9以上 WatchKit.
Xcode 6 及以上 必需.
支持Objective-C Swift 1.2 Swift 2.0
安装
静态库安装 (Objective-C & Swift)
1.下载最新的Realm
发行版本并在本地解压。
2.从 ios/static/
目录里,把Realm.framework
文件拖动到你的Xcode开发项目里的File Navigator
中。 确保Copy items into destination group’s folder
已经被选中,按Finish。
3.在Xcode file explorer
中选中你要的开发项目. 选择target
,点击Build Phases
选项. 在Link Binary with Libraries
里按+,添加libc++.dylib
。
4.如果使用Realm + Swift
,拖动Swift/RLMSupport.swift
到你的Xcode project
的File Navigator
中,点选Copy items if needed
。
5.如果在OSX项目中使用Realm,点击左上角的 + ,选择New Copy Files Phase
,将其重命名为Copy Frameworks
, 将Destination设置为Frameworks,并且添加Realm.framework
。
动态库安装 (Objective-C & Swift)
1.下载最新的Realm
发行版本并在本地解压。
2.来到Xcode工程的General
设置界面,从 ios/dynamic/
或者osx/
目录里,把Realm.framework
文件拖动到Embedded Binaries
里面。 确保Copy items into destination group’s folder
已经被选中,按Finish。
3.In your unit test target’s “Build Settings”, add the parent path to Realm.framework in the “Framework Search Paths” section.
4.If using Realm with Swift, drag the file at Swift/RLMSupport.swift into the File Navigator of your Xcode project, checking the Copy items if needed checkbox.
5.If using Realm in an iOS 8 project, create a new “Run Script Phase” in your app’s target’s “Build Phases” and paste the following snippet in the script text field: bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh" This step is required to work around an App Store submission bug when archiving universal binaries.
通过CocoaPods安装 (Objective-C Only)
如果你使用CocoaPods…
1.把pod "Realm"
添加到你的Podfile中。
2.在命令行中执行pod install
。
3.将CocoaPods
生成的.xcworkspace
运用到你的开发项目中即可。
Xcode 插件
我们的Xcode插件让新建Realm模型model
很轻松。安装Realm Xcode插件的最简单的途径就是通过Alcatraz在RealmPlugin
目录下。
你也可以自行手动安装:打开release zip
中的plugin/RealmPlugin.xcodeproj
, 点击编译build
。 重启Xcode生效。
如果你使用Xcode新建文件File > New > File… — or ⌘ N
,可以看到有一个新建Realm模型create a new realm model
的选项。
Realm浏览器/数据库管理器
我们另外提供了一个独立的数据库管理工具,用来查看和编辑realm数据库.realm
。
你可以从browser/
的release zip
目录下找到它。
使用菜单中的工具tool
>生成演示数据库generate demo database
, 你可以生成一个测试数据库(当然里面的数据是样本数据).
API 参考
所有的类和方法什么的都可以去API文档查阅
示例
你可以在examples/
路径里面找到一个文件,叫做release zip
。 里面包含了Objective-C
, Swift
和RubyMotion
的示例程序。 它们演示了Realm
得很多功能和特性,例如数据库迁移,如何与UITableViewController’s
一起使用,加密等等。
数据模型(model)
Realm的数据模型是用传统的Objective-C 接口interface
和@properties
定义的。 就只要定义RLMObject
的一个子类subclass
或者一个现成的模型类,你就能轻松创建一个Realm
的数据模型对象data model object
。Realm
模型对象和其他的objective-c
的功能很相似–你可以给它们添加你自己的方法method
和协议protocol
然后和其他的对象一样使用。
唯一的限制就是从它们被创建开始,只能在一个进程中被使用。
如果你已经安装了我们的Xcode
插件 那么,在New File
对话框中会有一个很漂亮的样板,你可以用它来创建interface
和implementation
文件。
你只需要为对象列表添加目标类型的属性property
或者RLMArray
的,就可以创建数据库关联和嵌套数据结构
#import <Realm/Realm.h>
@class Person;
// Dog model
@interface Dog : RLMObject
@property NSString *name;
@property Person *owner;
@end
RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog>
// Person model
@interface Person : RLMObject
@property NSString *name;
@property NSDate *birthdate;
@property RLMArray<Dog> *dogs;
@end
RLM_ARRAY_TYPE(Person) // define RLMArray<Person>
// Implementations
@implementation Dog
@end // none needed
@implementation Person
@end // none needed
RLMObject的相关细节.
属性property
种类
Realm支持以下的属性property
种类: BOOL
,bool
, int
, NSInteger
, long
, float
, double
, CGFloat
, NSString
, NSDate
和NSData
。
你可以使用RLMArray<NSObject>
和RLMObject
来模拟对一或对多的关系
Realm
也支持RLMObject
继承。
属性property
特性
请注意Realm
忽略了objective-c
的property attributes
,像nonatomic
, atomic
, strong
, copy
, weak
等等。
所以,为了避免误解,我们推荐你在写入模型的时候不要使用任何的property attributes
。但是,假如你设置了,这些attributes
会一直生效直到RLMObject
被写入realm
数据库。
无论RLMObject
在或不在realm
中,你为getter
和setter
自定义的名字都能正常工作。
数据模型定制
几个存在的类方法进一步指定模型信息:
+attributesForProperty:
可以被重写来来提供特定属性property
的属性值attrbutes
例如某个属性值要添加索引。
+defaultPropertyValues
可以被重写,用以为新建的对象提供默认值。
+primaryKey
可以被重写来设置模型的主键。定义主键可以提高效率并且确保唯一性。
ignoredProperties
可以被重写来防止Realm
存储模型属性。
存储对象
对对象的所有更改(添加,修改 和删除)都必须通过写入事务完成。
Realm
的对象可以被实例化并且被单独使用,和其他常规对象无异。
如果你想要在多个线程中共享或者永久保存以重复使用对象,你必须将其存储到Realm数据库中——这个操作必须在写事务中完成。 你可以参照如下代码添加一个对象:
创建一个对象
Person *author = [[Person alloc] init];author.name = @"David Foster Wallace";
获取一个默认realm对象
RealmRLMRealm *realm = [RLMRealm defaultRealm];
你只须这么做一次(单线程操作) Add to Realm with transaction
[realm beginWriteTransaction];
[realm addObject:author];
[realm commitWriteTransaction];
等到你把这个对象添加到realm数据库里面之后, 你可以在多个线程里面共享之。
并且从现在开始,你所做的每一次更改(必须在一个写事务中完成)也会被永久储存。
等到写事务完成,这个更改将对所有共享这个Realm数据库的线程可见。
需要注意的是,写入操作会相互阻塞,而且其相对应的进程也会受到影响。
这和其他的永久数据存储解决方案是一样的,所以我们建议你使用常用的,也是最有效的方案, 将所有写入放到一个单独的进程中。
还要注意的是,因为realm的MVCC结构, 读取并不会 因为一个进行中的写事务而受到影响。
详细内容,请阅读RLMObject。
查询
所有的数据抓取都很简单,并且直到获得数据之后才创建副本。
关于使用RLMResults的小贴士:
Realm的对象查询返回一个RLMResults对象。它包含了一系列的RLMObject。
RLMResults有一个与NSArray很相似的interface(接口)并且对象可以通过索引(index)下标获取。
但不同于NSArrays的是,RLMResult是归类的——它只能容纳一种RLMObjects类型。
根据种类获取对象从realm中获取对象的最基本方法就是 [RLMObject allObjects], 它返回一个RLMResults,里面是查询的子类的所有RLMObject实例。
// 默认查询RealmRLMResults *dogs = [Dog allObjects]; // 从默认Realm中查找所有的