做者:Hossam Ghareeb,原文連接,原文日期:2015-10-28
譯者:Prayer;校對:Cee;定稿:千葉知風ios
智能手機的快速發展的同時,涌現出了不少對開發者友好的開發工具。這些工具不只使得開發變得更加簡單和容易,同時也保證了性能和產品質量。現在想要在 App Store 中佔據一席之地,並不是易事。並且想要使得應用易於擴展就更加困難了。當你成功得到百萬量級的用戶時,應用中的每個細節都不能放過,而且須要在很短的時間完成對細節的打磨。因此和數據庫打交道,是不少開發者都會面臨的一個問題。相信咱們每一個人都會由於數據庫引發的各類問題而頭疼不已,對於數據庫,我想現在咱們只有兩種選擇:SQLite 和 Core Data。我是 Core Data 的忠實粉絲,它對記錄(records)的處理和持久化數據的能力很是強大,可是我意識到,在開發應用的過程當中,我在 Core Data 上浪費了太多的時間。最近,我無心中發現了 Realm,一個能夠替代 SQLite 和 Core Data 的更好的解決方案。git
<!--more-->github
Realm 是一個跨平臺的移動終端數據庫,支持 iOS(Swift 和 Objective-C 語言都支持)和 Android。Realm 的目的就是提供比 SQLite 和 Core Data 更好更快的數據庫支持。它不只僅是更好和更快,並且更加易於使用,短短几行代碼就能夠完成不少操做。Realm 徹底免費,你能夠隨意使用它。Realm 是爲移動設備而生的,由於在過去的十年中,移動終端的數據庫技術沒有任何的革新。如今若是和移動終端的數據庫打交道,你只有一種選擇,使用 SQLite 或者是底層封裝了 SQLite 的技術好比 Core Data。Realm 的目的是更加易用,它並非一個創建在 SQLite 之上的 ORM,而是一個基於本身的持久化引擎,簡單而且快速的面向對象移動數據庫。sql
Realm擁有使人難以置信的速度而且使用起來很是簡單,你會發現,不管是想完成數據庫的讀仍是寫操做,都只須要短短的幾行代碼。下面我會列出它的全部優點,並說明爲何 Realm 是你在移動應用上數據庫的不二選擇:數據庫
安裝簡單:在下一個章節 — 如何使用 Realm 中你會了解到,安裝 Realm 會比你想象的更爲簡單。使用簡單的 Cocoapods 命令,你就能夠完成全部的安裝工做。swift
速度更快:使用 Realm 庫操做數據庫的速度很是快。它比 SQLite 和 CoreData 都更加快速,這裏有它們之間的比較指標做爲證據。數組
跨平臺:Realm 的數據庫文件是跨平臺的,能夠在 iOS 和 Android 間共享。不管你是使用 Java、Objective-C 或者 Swift,均可以使用相同的抽象模型訪問。xcode
易於擴展:若是你的移動應用須要處理大量的用戶數據記錄,數據庫的可擴展性就顯得十分重要。在開始着手開發應用以前,這一點就應該被考慮在內。Realm 提供很好的可擴展性,在操做大量的數據時,速度也很是之快。選擇使用 Realm 能夠爲你的應用帶來更快的速度和更加流暢的用戶體驗。瀏覽器
規範的文檔和很好的支持:Realm 提供了豐富的大量條理清晰、易於閱讀的文檔。若是你有任何的問題,你也能夠經過 Twitter、Github 或 Stackoverflow 來得到幫助。安全
可信任:Realm 已經被大量的初創公司和大公司用於它們的移動應用中,像 Pinterest、Dubsmash 和 Hipmunk。
免費:除了以上這些極好的優勢之外,它仍是完!全!免!費!的!
讓咱們開始學習 Realm,使用它來構建一個簡單的使用 Swift 語言的 iPhone 應用。所完成的 demo 程序是一個簡單的 Todo 應用。用戶能夠增長任務清單,每一個任務清單都可以包含多個任務。任務擁有名稱、備註、到期日期,能夠添加圖片,而且擁有一個布爾值來表示該任務是否已經完成。在開始建立 Xcode 項目以前,咱們須要先配置好 Xcode,安裝使用 Realm 所需的工具。
請注意須要知足下列要求
iOS 8 及更高的版本,OS X 10.9 及更高的版本
Xcode 6.3 及更高版本
Realm 有兩個發行版,一個針對 Swift 2.0,另外一個針對 Swift 1.2。咱們推薦您使用 Swift 2.0 的版本。固然你也可使用針對 Swift 1.2 的版本,可是之後這個版本 Realm 不會再進行更新支持,因此爲了保險起見,使用 Swift 2.0 對應的版本,是個更好的選擇。
在開始配置 Xcode 項目以前,請確保運行環境已經正確安裝了 CocoaPods,咱們將使用它來爲項目安裝 Realm。若是對 CocoaPods 不熟悉,你能夠查看在線的教程,這些教程的材料足夠讓你明白如何開始使用它。
如今,使用 Single View Application
項目模板建立一個 Xcode 工程,命名爲 RealmTasks
或者其餘你喜歡的名字。請確保選擇 Swift 做爲開發語言。以後在終端中進入到該工程目錄,使用以下命令來初始化 CocoaPods:
bash pod init
而後使用 Xcode 打開生成的 Podfile 文件,在 target 以後,添加 pod 'RealmSwift'
,修改完以後,應該是下面這個樣子:
下面運行 pod install
命令來把 Realm 下載安裝到項目中。完成以後,你會在你的工程文件目錄發現一個新生成的 Xcode 工做空間。請確保打開 RealmTasks.xcworkspace 而不是 xcodeproj。打開工做空間後,你會看到像下面這樣的情形:
如今就能夠在 Xcode 中使用 Realm 啦,可是咱們將安裝下面的小工具來讓使用 Realm 的過程更加容易。
Realm 開發團隊提供了一個生成 Realm 模型很是有用的插件。爲了安裝這個插件,咱們要使用 Alcatraz。若是你不知道 Alcatraz 是什麼的話,這裏解釋一下,它是一個簡單有用的開源包管理工具,它可讓你無需任何配置,自動地爲 Xcode 安裝插件、文件模板和顏色主題。爲了安裝 Alcatraz,你只需將如下代碼複製到終端中執行,以後重啓 Xcode:
bash curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
而後在 Xcode 中,選擇 Window
-> Package Manager
,以下圖:
而後在彈出的窗口中,你能夠選擇安裝你喜歡的插件或者文件模板,在搜索框中你能夠搜索你喜歡的插件、配色。在搜索框輸入「Realm」,在出現的結果中選擇「RealmPlugin」,點擊 Install
按鈕
給你們介紹的最後一個工具是 Realm 瀏覽器。這個瀏覽器能夠幫助你閱讀和編輯你的 .realm
數據庫文件。這些文件在應用程序中被建立,在數據庫表中保存了全部的數據實體(entities)、屬性(attributes)和記錄(records)。以前咱們說過,這些數據庫文件能夠在像 iOS 和 Android 這樣不一樣的平臺間共享。想要下載最新版本的 Realm 瀏覽器,請訪問 iTunes store。打開 Realm 瀏覽器,選擇 Tools
-> Generate demo database
。它會幫你生成 realm 數據庫測試文件,你可使用該瀏覽器打開和編輯它的內容。當你打開的時候,你會看到像下面的內容:
正如你所見,在 RealmTestClass1 中,它擁有 1000 條記錄,顯示了多種不一樣的參數類型(即「列」)。咱們會在下節介紹支持的屬性類型。
如今,Realm 的全部準備工做都已就緒,那咱們開始動手吧!
好戲纔剛剛開始。首先咱們來建立模型類或者說咱們的數據庫。爲了建立 Realm 數據模型類,你只須要簡單地新建一個普通的 Swift 類繼承自 Object 就能夠了。由於 Realm 數據模型類的基類是 Object,因此 Object 的子類均可以擴展爲 Realm 的模型類。一旦建立類後,就能夠添加屬性了。Realm 支持如下多種數據類型:
– Int,Int8,Int16,Int32 和 Int64
– Boolean
– Float
– String
– NSDate
– NSData
– 繼承自 Object 的類 => 做爲一對一關係(Used for One-to-one relations)
– List<Object> => 做爲一對多關係(Used for one-to-many relations)
Realm 中的 List 能夠包含多個 Object 實例,參考上面 demo 數據庫的截圖,最後一列表示在其餘數據表中的存在的一組引用。在和 Realm 模型類打交道的時候,使用的方式和其餘 Swift 類同樣。例如,你能夠添加方法或者遵循指定的協議。
多說無益,來看代碼 ?
如今讓咱們使用以前在 Xcode 中安裝的 Realm 插件來新建一個 Realm 類。打開 Xcode,新建文件,在右邊的側邊欄選擇 Realm:
而後選擇 Swift 語言,類名咱們輸入 Task。會獲得以下結果:
如今,能夠向 Task 數據模型中添加屬性了。
咱們須要在數據模型中添加須要的屬性。該例子中,Task 須要有 name(String),createdAt(NSDate)),notes(String),和 isCompleted(Bool)這些屬性。添加這些以後,代碼應該像下面這樣子:
class Task: Object { dynamic var name = "" dynamic var createdAt = NSDate() dynamic var notes = "" dynamic var isCompleted = false // 聲明讓 Realm 忽略的屬性(Realm 將不持有這些屬性) // override static func ignoredProperties() -> [String] { // return [] // } }
咱們已經爲 Task 模型類添加了屬性,全部的屬性前面都加了 dynamic var
前綴,這使得屬性能夠被數據庫讀寫。
接下來,咱們要建立 TaskList 模型類,用來存儲 Task 實例:
class TaskList: Object { dynamic var name = "" dynamic var createdAt = NSDate() let tasks = List<Task>() // 聲明讓 Realm 忽略的屬性(Realm 將不持有這些屬性) // override static func ignoredProperties() -> [String] { // return [] // } }
TaskList 模型類擁有 name,createAt 和一個包含 Task 的 List 屬性。須要注意的是:
List<Object> 用來表示一對多的關係:一個 TaskList 中擁有多個 Task。
List 和 Array 在使用上很是類似,所用的方法和訪問數據的方式(索引和下標)都相同。正如你所見的同樣,List 後標明瞭數據類型,所包含的全部對象都應該是相同類型的。
List 是泛型,這也是爲何咱們沒有在聲明前面加上 dynamic 的緣由,由於在 Objective-C 運行時沒法表示泛型屬性。
就像在以前實現中你看到的一對多關係那樣,在 Realm 中建立數據關係很是簡單。在使用一對一的關係時,咱們不使用 List 而是使用 Object 類型,來看下面的例子:
class Person: Object{ dynamic var name = "" } class Car: Object{ dynamic var owner:Person? }
上面的例子中,owner 屬性表示 Car 和 Person 之間的一對一數據關係。
如今基本的數據模型都已經建立好了。接下來咱們會經過建立一個 ToDo 應用的過程,來討論 Realm。首先,從這裏下載 app 而且一窺究竟。在 Xcode 7 或更高的版本中運行,就像下面這樣:
在項目中,我添加了兩個視圖控制器:TasksViewController 和 TaskListViewController。第一個視圖控制器用來顯示單個 task,第二個視圖控制器用來顯示全部的 TaskList。在 list 視圖中,點擊 + 按鈕來添加一個任務清單。選擇一個任務清單將會詳情視圖。你能夠在這裏添加多個 task。
瞭解了 demo 的大致思路以後,如今讓咱們來看看如何向 Realm 數據庫中添加一個新的任務清單。爲了實現這個功能,須要以下處理:
建立 TaskList 實例對象,並將其保存到 Realm 數據庫中。
向數據庫中查詢 list 數據,並更新 UI。
爲了在 Realm 中保存數據,你只須要實例化繼承自 Object 的數據模型類,而後將對象寫入到 Realm 中,下面是示例代碼:
let taskListA = TaskList() taskListA.name = "Wishlist" let wish1 = Task() wish1.name = "iPhone6s" wish1.notes = "64 GB, Gold" let wish2 = Task(value: ["name": "Game Console", "notes": "Playstation 4, 1 TB"]) let wish3 = Task(value: ["Car", NSDate(), "Auto R8", false]) taskListA.tasks.appendContentsOf([wish1, wish2, wish3])
經過實例化 TaskList 類,咱們建立了一個任務清單,以後設置了它的屬性。隨後咱們建立了 3 個 Task 類型的對象(即 wish1,wish2 和 wish3)。這裏咱們演示了建立 Realm 對象的三種途徑:
wish1 的實例化方式:簡單的實例化 Realm 類,而後設置屬性。
wish2 的實例化方式:傳入一個字典,字典中的 key 爲屬性名,值爲要設置的值。
wish3 的實例化方式:使用數組傳入的方式。數組中值的順序須要和模型類中的聲明順序一致。
在 Realm 中還能夠是使用嵌套的方式來建立對象。在一對一關係和一對多關係的時候,你可使用這種方式,這時候,一個類型對象的初始化須要一個 Object 或多個另外一個類型的對象 List<Object>。面臨這種狀況的時候,你能夠選擇上面的第二或者第三種方法,使用一個字典或者一個數組來表示一個對象。下面是嵌套對象的一個例子:
let taskListB = TaskList(value: ["MoviesList", NSDate(), [["The Martian", NSDate(), "", false], ["The Maze Runner", NSDate(), "", true]]])
在上面的代碼中,咱們建立了一個電影清單,並設置了清單名稱、建立時間和清單內容,清單內容包括多個 task。每一個 task 使用數組的方式來建立,例如 ["The Maze Runner", NSDate(), "", true]
表示一個 task,內容分別對應了名稱、建立時間、備註和是否已經完成。
如今你應該知道了如何在 Realm 中建立和使用對象,可是爲了可以在應用程序從新啓動的時候使用這些數據,須要使用寫事務將它們持久化到 Realm 的數據庫中。當使用 Realm 來持久化數據的時候,只要這些對象已經存儲成功,你能夠在任何線程中獲取這些對象。一個 Realm 實例表示一個 Realm 數據庫。能夠像下面同樣實例化它:
let uiRealm = try! Realm()
咱們經常將上面這行代碼寫在 AppDelegate.swift
文件的頂端(譯者注:類以外,全局變量),這樣就能夠在整個項目中得到該對象的引用。以後即可以很方便地調用它的讀和寫方法:
uiRealm.write { () -> Void in uiRealm.add([taskListA, taskListB]) }
首先,uiRealm 對象已經在 AppDelegate 中建立,在整個 app 中均可以使用。Realm 對象在每一個線程中都應該只被建立一次,由於它不是線程安全的,不能在不一樣的線程中共享。若是你想要在另外一個線程中執行寫操做,那麼就須要建立一個新的 Realm 對象。我將這個實例命名爲 uiRealm
,就是由於它應該只在 UI 線程中被使用。
如今讓咱們回到咱們的 app 中,咱們須要在用戶點擊 Create 按鈕的時候保存任務列表。在 TasksViewController
的 displayAlertToAddTask
方法中,咱們有一個 createAction
對象:
let createAction = UIAlertAction(title: doneTitle, style: UIAlertActionStyle.Default) { (action) -> Void in let taskName = alertController.textFields?.first?.text if updatedTask != nil{ // update mode uiRealm.write({ () -> Void in updatedTask.name = taskName! self.readTasksAndUpateUI() }) } else{ let newTask = Task() newTask.name = taskName! uiRealm.write({ () -> Void in self.selectedList.tasks.append(newTask) self.readTasksAndUpateUI() }) } }
在上面的代碼中,咱們從 TextField 中獲取到任務名稱,調用 Realm 的寫方法來保存任務列表。
請注意,當你同時進行多個寫操做的時候,他們會相互阻塞,阻塞住他們所運行的線程。因此應當考慮在 UI 以外的線程中來進行操做。另外須要注意的是,在進行寫事務的時候,讀操做並不會形成阻塞。這很是有用,尤爲是當你在後臺進行寫操做的時候,用戶可能會在不一樣界面切換,而這時候能夠進行讀操做。
如今你已經學會了如何在 Realm 中寫數據,下面咱們來看看如何檢索數據。在 Realm 中檢索數據的方式很是直觀。Realm 提供了不少選項來過濾出你想要的數據。在 Realm 中進行查找操做的時候,它將會返回一個 Results 對象。能夠把 Results 簡單地當作是 Swift 的數組,由於它們的接口很是相似。
當獲得 Results 實例的時候,這表明你已經從磁盤中直接獲取到了數據。對這些數據的任何操做(使用事務)將會影響到磁盤上的數據。在 Realm 中來檢索數據,只須要調用對象的方法,並將類名做爲參數傳進去。讓咱們看看如何使用這種方式來讀取 TaskLists 並更新 UI:
咱們在 TasksListsViewController
中定義了該屬性:
var lists : Results<TaskList>!
而後實現了 readTasksAndUpdateUI
方法:
func readTasksAndUpdateUI(){ lists = uiRealm.objects(TaskList) self.taskListsTableView.setEditing(false, animated: true) self.taskListsTableView.reloadData() }
在 tableView(_:cellForRowAtIndexPath:_)
方法中,咱們將顯示列表的名稱,還有每一個列表內的任務個數:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCellWithIdentifier("listCell") let list = lists[indexPath.row] cell?.textLabel?.text = list.name cell?.detailTextLabel?.text = "\(list.tasks.count) Tasks" return cell! }
代碼邏輯很是直觀吧。最後須要作的就是在 viewWillAppear
中調用 readTasksAndUpdateUI
方法,來確保老是顯示數據更新以後的視圖。
override func viewWillAppear(animated: Bool) { readTasksAndUpdateUI() }
上面展現瞭如何使用 Realm 來進行任務列表的讀寫操做。接下來,咱們來看看如何進行數據更新和刪除操做。在開始以前,先來看看項目模板中的修改和刪除部分的相關代碼。
首先在 TaskListsViewController
中,咱們用一個布爾值 isEditingMode
來表示是在正常狀態仍是編輯狀態:
var isEditingMode = false
當 Edit 按鈕被點擊的時候,將會調用 didClickOnEditButton
方法:
@IBAction func didClickOnEditButton(sender: UIBarButtonItem) { isEditingMode = !isEditingMode self.taskListsTableView.setEditing(isEditingMode, animated: true) }
這個方法會使用 table view 的 setEditing
方法來啓用或禁用 UITableView 的編輯模式。在表格視圖中,默認的編輯操做是刪除,可是從 iOS 8.0 開始,增長了一個 editActionsForRowAtIndexPath
方法來自定義一些操做,這些操做在在用戶滑動表格 cell 的時候出現。
咱們將使用該方法來添加兩個功能 — 刪除和編輯,代碼以下:
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Destructive, title: "Delete") { (deleteAction, indexPath) -> Void in //這裏開始是刪除 let listToBeDeleted = self.lists[indexPath.row] uiRealm.write({ () -> Void in uiRealm.delete(listToBeDeleted) self.readTasksAndUpdateUI() }) } let editAction = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "Edit") { (editAction, indexPath) -> Void in // 這裏開始是編輯 let listToBeUpdated = self.lists[indexPath.row] self.displayAlertToAddTaskList(listToBeUpdated) } return [deleteAction, editAction] }
這裏咱們使用 UITableViewRowAction
添加了兩個操做,方法中定義了操做的 style
,title
和 handler
。當在滑動 cell 或者以其餘方式進入編輯模式的時候,會像下面這樣:
以上就是在進行刪除和更新操做時候的 UI 代碼邏輯。
想要從 Realm 數據庫中刪除對象或者數據,你只須要調用 Realm 對象的 delete
方法,同時將該對象做爲參數傳入。固然,這些操做會在寫事務中完成。來看一下下面的代碼的工做方式,咱們從 Realm 數據庫中刪除了一個任務列表:
let listToBeDeleted = self.lists[indexPath.row] uiRealm.write({ () -> Void in uiRealm.delete(listToBeDeleted) self.readTasksAndUpdateUI() })
在刪除以後,咱們調用了 readTasksAndUpdateUI
方法來讀取數據並更新 UI。
除了刪除單個數據,在 Realm 中,還有一個方法叫作 deleteAll
,它容許你刪除數據庫中全部 class 的全部數據。若是你想爲當前用戶持久化數據,可是在他退出登陸的時候抹掉全部的相關數據,這個方法將會十分有用。
uiRealm.write({ () -> Void in uiRealm.deleteAll() })
在 Realm 中有多種方式能夠來更新 object,可是這些方法都應該在寫事務中完成。下面咱們來看一些更新對象的方式。
你能夠經過直接在 Realm 的寫閉包中設置屬性的值來更新數據。例如,在 TasksViewController
中,咱們能夠簡單地設置屬性值來更新任務的狀態信息:
uiRealm.write({ () -> Void in task.isCompleted = true })
Realm 支持將某個 string 或 int 類型的屬性設置爲主鍵。當使用 add()
方法來建立 Realm 對象時,若是有相同主鍵的對象存在,就會更新這個對象的值。下面是示例代碼:
let user = User() user.firstName = "John" user.lastName = "Smith" user.email = "example@example.com" user.id = 1 // 更新 id 是 1 的用戶 realm.write { realm.add(user, update: true) }
這裏的 id 屬性爲主鍵。若是 id 爲 1 的用戶存在,Realm 會更新相應的對象。若是不存在,Realm 將會把該對象存入數據庫中。
若是你是 iOS 開發的老手,那麼對 Key-Value Coding 確定不會陌生。Realm 的類型,像是 Object、Results 和 List,均可以使用 Key-Value Coding。該特性能夠幫助你在運行時設置或更新屬性值。另一個在 List 和 Results 中支持 KVC 的好處是,能夠在無需遍歷每一個對象的狀況下,批量更新對象數據。這麼說你可能不是很理解,咱們來看個例子:
let tasks = uiRealm.objects(Task) uiRealm.write { () -> Void in tasks.setValue(true, forKeyPath: "isCompleted") }
在上面的代碼中,使用查詢語句來請求全部的 Task 對象,以後將全部獲得的對象的 isCompleted
屬性設置爲 true。能夠看出,將 Realm 中的全部 tasks 標記爲已完成,僅僅只用了一行代碼。
讓咱們回過頭來看看咱們的 ToDo 應用。若是仔細觀察 displayAlertToAddTaskList
方法,你會看到以下代碼片斷:
// 更新狀態 uiRealm.write({ () -> Void in updatedList.name = listName! self.readTasksAndUpdateUI() })
當用戶遍歷列表名稱的時候,上面的代碼會被調用。經過設置 name 屬性的方式,就更新了數據庫中的內容。
咱們已經一塊兒看過了 TaskListViewController
的絕大部分代碼。如今讓咱們打開 TasksViewController
來看看,這個視圖控制器用來顯示任務清單中的任務項。視圖控制器擁有一個 UITableView, 該視圖有兩個 section:完成的任務和未完成的任務。在 TasksViewController
中,有以下屬性:
var selectedList : TaskList! var openTasks : Results<Task>! var completedTasks : Results<Task>!
selectedList
用來存儲 TaskListsViewController
傳遞過來的選中的任務列表。爲了將完成和未完成的任務分開,聲明瞭兩個屬性,openTasks
和 completedTasks
。爲了過濾出不一樣的任務完成狀態,咱們將使用 Realm 的方法 filter()
。在解釋該函數如何工做以前,讓咱們先來看看如何在代碼中使用它:
func readTasksAndUpateUI(){ completedTasks = self.selectedList.tasks.filter("isCompleted = true") openTasks = self.selectedList.tasks.filter("isCompleted = false") self.tasksTableView.reloadData() }
在上面的方法中,咱們使用 filter
方法來過濾 results
。Realm 提供了 filter()
方法來過濾數據。該方法能夠被 List、Result 和 Object 對象調用。方法會返回過知足濾條件參數的特定對象。你能夠把 filter
當作 NSPredicate
。基本上來講,你能夠認爲這二者差很少。就像上面的代碼同樣,你一樣可使用 string 做爲參數建立一個 NSPredicate
對象,並把它做爲參數傳給 filter
方法。
讓咱們來看另一個例子:
// 使用斷言字符串 var redCars = realm.objects(Car).filter("color = 'red' AND name BEGINSWITH 'BMW'") // 使用 NSPredicate let aPredicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "red", "BMW") redCars = realm.objects(Car).filter(aPredicate)
在上面的代碼中,咱們使用 filter
方法來過濾 color
爲 red,而且 name
以 "BMW" 開頭的對象。第一行代碼使用 string 做爲參數來進行過濾。另外,你也可使用 NSPredicate 得到一樣的效果。下面的表格總結了 filter 方法的大部分經常使用操做:
既然咱們談到了 Realm 數據庫的基本操做,在本教程結束以前,我還想給你們介紹另一個特性。排序功能,這是 Realm 提供了另外一個特別有用的特性。對於 List 和 Result 對象,你能夠調用方法 sorted(「排序標準」)
來將一組數據進行排序。讓咱們來看看如何在任務列表中使用該方法讓任務列表以字母表或者建立時間前後順序排序。首先,在 UI 中,咱們增長了一個 segment control,將會根據選擇的狀況來進行對應的排序。
根據不一樣的選擇來進行排序,代碼邏輯以下:
@IBAction func didSelectSortCriteria(sender: UISegmentedControl) { if sender.selectedSegmentIndex == 0{ // 按 A-Z 排序 self.lists = self.lists.sorted("name") } else{ // 按日期排序 self.lists = self.lists.sorted("createdAt", ascending:false) } self.taskListsTableView.reloadData() }
Realm 是一個很是簡單易用,直觀的本地數據庫解決方案。Realm 提供了很好的可擴展性,只用不多的幾行代碼就可完成操做。對於大部分的應用甚至是遊戲來講,我以爲若是須要使用數據庫的話,Realm 值得嘗試。
學習了本教程,你應該能夠在項目中使用 Realm 來進行增刪改查等基本的操做。Realm 還具備一些高階特性,值得深刻學習。最好的學習資料就是 Realm 網站的官方文檔,Realm 的小夥伴把文檔寫得很是贊!
若是想要教程 ToDo 應用的的完整代碼,你能夠在這裏下載。
若是對代碼有任何的問題,都歡迎留言反饋,咱們會很樂意幫助到您。
本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg。