Realm,一個跨平臺、高效能的資料庫

weixin_33866037發表於2016-06-16

為什麼要使用Realm?

1、簡單易用

Realm並不是一個建立在SQLite之上的ORM,而是一個基於自己的持久化引擎,簡單並且快速的物件導向移動資料庫。我們的使用者們說分分鐘就學會了怎樣使用Realm,遷移App到Realm也不過只需要花幾個小時,方便的Realm為他們省卻了數週的開發工作。

2、跨平臺

Realm支援iOS、OS X(Objective-C和Swift)以及Android。Realm檔案可以跨平臺共享,讓Java、Swift和Objective-C使用相同的抽象模型訪問,從而讓您在各個平臺上使用盡可能相似的業務邏輯。

3、快速

得益於zero-copy的設計,Realm比普通的ORM要快很多,甚至比單獨無封裝的SQLite還要快。請參考iOS benchmark和Android benchmark,或者看看我們的使用者們在Twitter上怎麼說。

4、支援

您可以通過以下渠道獲得迅速的官方支援:Github、StackOverflow、Twitter、微博。

安裝

系統要求

1、使用 Realm 構建應用的基本要求:iOS >= 7, OS X >= 10.9,並且支援 WatchKit;
2、需要使用 Xcode 6.4 或者以後的版本;
3、程式支援Objective-C, Swift 1.2 & Swift 2.x。

動態框架

注意:動態框架與 iOS 7 不相容,要支援 iOS 7 的話請使用"靜態框架"。
1、下載最新的Realm發行版本,並解壓;
2、前往Xcode 工程的"General"設定項中,從ios/dynamic/、osx/、tvos/或者watchos/中將"Realm.framework"拖曳到"Embedded Binaries"選項中。確認Copy items if needed被選中後,點選Finish按鈕;
3、在單元測試目標的”Build Settings”中,在”Framework Search Paths”中新增Realm.framework的上級目錄;
4、如果希望使用Swift載入Realm,請拖動Swift/RLMSupport.swift檔案到 Xcode 工程的檔案導航欄中並選中Copy items if needed;
5、如果在 iOS、watchOS 或者 tvOS 專案中使用 Realm,請在您應用目標的”Build Phases”中,建立一個新的”Run Script Phase”,並將這條指令碼複製到文字框中。 因為要繞過APP商店提交的bug,這一步在打包通用裝置的二進位制釋出版本時是必須的。

bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh"

靜態框架

1、下載 Realm 的最新版本並解壓;
2、將 Realm.framework 從 ios/static/ 資料夾拖曳到您 Xcode 專案中的檔案導航器當中。確保 Copy items if needed 選中然後單擊 Finish;
3、在 Xcode 檔案導航器中選擇您的專案,然後選擇您的應用目標,進入到** Build Phases** 選項卡中。在 Link Binary with Libraries 中單擊 + 號然後新增 libc++.dylib;
4、如果你在用 Swift 來使用 Realm,那麼將位於 Swift/RLMSupport.swift 的檔案拖曳進您 Xcode 專案中的檔案導航器當中,確保 Copy items if needed 選中。

從這裡開始

Objective-C版本的 Realm 能夠讓您以一種安全、耐用以及迅捷的方式來高效地編寫應用的資料模型層,如下例所示:

// 定義模型的做法和定義常規 Objective-C 類的做法類似
@interface Dog : RLMObject
@property NSString *name;
@property NSInteger age;
@end
RLM_ARRAY_TYPE(Dog)
@interface Person : RLMObject
@property NSString             *name;
@property NSData               *picture;
@property RLMArray<Dog *><Dog> *dogs;
@end
//-------------------------------------------
// 使用的方法和常規 Objective-C 物件的使用方法類似
Dog *mydog = [[Dog alloc] init];
mydog.name = @"大黃";
mydog.age = 1;
mydog.picture = nil; // 屬性的值可以為空
NSLog(@"狗狗的名字: %@", mydog.name);
//-------------------------------------------
// 檢索 Realm 資料庫,找到小於 2 歲 的所有狗狗
RLMResults<Dog *> *puppies = [Dog objectsWhere:@"age < 2"];
puppies.count; // => 0 因為目前還沒有任何狗狗被新增到了 Realm 資料庫中
//-------------------------------------------
// 資料持久化操作十分簡單
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
  [realm addObject:mydog];
}];
//-------------------------------------------
// 檢索結果會實時更新
puppies.count; // => 1
//-------------------------------------------
// 可以在任何一個執行緒中執行檢索操作
dispatch_async(dispatch_queue_create("background", 0), ^{
  Dog *theDog = [[Dog objectsWhere:@"age == 1"] firstObject];
  RLMRealm *realm = [RLMRealm defaultRealm];
  [realm beginWriteTransaction];
  theDog.age = 3;
  [realm commitWriteTransaction];
});

相關資料

https://github.com/realm/realm-cocoa
https://realm.io/cn/docs/objc/latest/#section

Clang的技術部落格:https://chenhu1001.github.io

相關文章