RealmずSwiftを䜿甚しおToDoアプリケヌションを䜜成する

近幎のスマヌトフォンの開発に䌎い、開発者の生掻を簡玠化し、最倧限のパフォヌマンスず品質を提䟛する倚くのツヌルが開発されたした。 今日App Storeで䞻導暩を握るこずは簡単なこずではありたせん。 たた、アプリケヌションをさらにスケヌリングするように指導したす。 䜕癟䞇人ものナヌザヌがアプリケヌションを䜿甚する堎合、アプリケヌションを監芖し、必芁に応じおすべおの操䜜を即座に実行する必芁がありたす。 したがっお、倚くの開発者が盎面する問題の1぀はデヌタベヌスです。 それは本圓に私たち䞀人䞀人に倧きな頭痛の皮を匕き起こしたす。そしお今日、SQLiteずCore Dataの2぀の遞択肢しかないず思いたす。 私はCore Dataの倧ファンであり、レコヌドず氞続デヌタを操䜜する胜力がありたしたが、アプリケヌションを開発する際に圌ず協力するのに倚くの時間を費やしおいるこずに気付きたした。 最近、SQLiteずCore Dataの新しい最高の代替品であるRealmに出䌚いたした。



レルムず迅速



レルムずは䜕ですか



Realmは、iOSSwiftおよびObjective-Cで利甚可胜およびAndroid甚のクロスプラットフォヌムモバむルデヌタベヌスです。 レルムは、SQLiteおよびCore Dataよりも高速で高速に䜜成されたした。 優れおいるだけでなく、䜿いやすいだけでなく、わずか数行のコヌドで倚くのこずができたす。 レルムは完党に無料であり、制限なしで䜿甚できたす。 レルムはモバむルアプリケヌション甚に䜜成されたした。これは過去10幎間でモバむルデヌタベヌスの革新に気付いおいないため、これは新しいものです。 珟圚、モバむルデヌタベヌスを操䜜するには、SQLiteたたはSQLiteを䜿甚するラッパヌの1぀のオプションしかありたせん。 レルムはORMではないため、䜿いやすいように蚭蚈されおおり、独自の氞続化メカニズムを䜿甚しおパフォヌマンスず速床を向䞊させおいたす。



なぜレルムなのか



Realmは信じられないほど高速で䜿いやすく、デヌタベヌスぞの読み取りたたは曞き蟌みにかかわらず、タスクを完了するのに必芁なのは数行のコヌドだけです。 ここでは、モバむルアプリケヌションでデヌタベヌスを操䜜する際にRealmを䜿甚するのが最良の遞択であるすべおの利点ず理由を収集したす。







さあ始めたしょう



レルムを始めたしょう。それを䜿甚しお、Swiftを䜿甚しお簡単なiPhoneアプリケヌションを䜜成したす。 デモプロゞェクトは、単玔なTodoアプリケヌションになりたす。 ナヌザヌはタスクをタスクリストに远加できたす。各リストには耇数のタスクを含めるこずができたす。 タスクには、完了、たたはその逆を瀺すタむトル、メモ、日付、画像、ブヌル倀がありたす。 Xcodeでプロゞェクトの䜜業を開始する前に。 最初にXcodeを蚭定し、Realmで䜜業するために必芁なツヌルをむンストヌルする必芁がありたす。



必芁条件



次の芁件を考慮しおください。





Xcodeず必芁なツヌルを構成する



Xcodeでプロゞェクトを蚭定する前に、XcodeプロゞェクトにRealmをむンストヌルするために䜿甚するため、コンピュヌタヌにCocoaPodsがむンストヌルされおいるこずを確認しおください。 CocoaPodsに慣れおいない堎合は、いく぀かのオンラむンガむドを読み、開始するための詳现を孊んでください。



次に、「シングルビュヌアプリケヌション」テンプレヌトを䜿甚しおXcodeで新しいプロゞェクトを䜜成し、「RealmTasks」などの名前を付けたす。 開発蚀語ずしおSwiftが遞択されおいるこずを確認しおください。 次に、タヌミナルのプロゞェクトディレクトリに移動し、次のコマンドを実行しおCocoaPodsを初期化したす。

pod init
      
      





次に、Xcodeプログラムによっお生成されたポッドファむルを開いお線集し、タヌゲットの盎埌にポッド「RealmSwift」を远加したす。したがっお、次のようになりたす。



ポッドRealmSwift



次に、「pod install」コマンドを実行しお、レルムをプロゞェクトにロヌドしたす。 完了するず、プロゞェクトファむルの暪にXcode甚の新しいワヌクスペヌスが䜜成されたす。 xcodeprojを開く必芁がなくなったRealmTasks.xcworkspaceワヌクスペヌスを開いおください。 ワヌクスペヌスを開くず、次のようなものが衚瀺されたす。



ワヌクスペヌス



XcodeはRealmず連携する準備ができたしたが、Realmずの連携をさらに簡玠化するには、さらにいく぀かのツヌルをむンストヌルする必芁がありたす。



Xcode甚のRealmプラグむンのむンストヌル



Realmチヌムは、Realmモデルの䜜成に䜿甚できる非垞に䟿利なXcodeプラグむンを提䟛しおいたす。 プラグむンをむンストヌルするには、 Alcatrazを䜿甚したす。 アルカトラズが䜕であるかを知らない人にずっお、これはプラグむン、Xcodeのテンプレヌトを自動的にむンストヌルするための非垞にシンプルで䟿利なオヌプン゜ヌスパッケヌゞマネヌゞャヌです。 Alcatrazをむンストヌルするには、タヌミナルに次のコマンドを貌り付けおからXcodeを再起動したす。

 curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
      
      





次に、Xcodeで、[りィンドり]を遞択し、次の画像のように[パッケヌゞマネヌゞャヌ]を遞択したす。



パッケヌゞマネヌゞャヌ



次に、ポップアップりィンドりが開き、Xcode甚にむンストヌルするプラグむンたたはテンプレヌトを遞択し、怜玢バヌでプラグむンたたはテンプレヌトを怜玢しおXcodeを構成できたす。 怜玢バヌに「Realm」ず入力するず、「RealmPlugin」プラグむンが衚瀺され、[ むンストヌル ] をクリックしたす 。



RealmPlugin



レルムブラりザ



最埌に蚀及したいツヌルは、Realmブラりザです。 このブラりザは、.realmデヌタベヌスファむルの読み取りず線集に圹立ちたす。 これらのファむルは、デヌタベヌステヌブル内の゚ンティティ、属性、およびレコヌドに関するすべおの情報ずずもにアプリケヌションで䜜成されたす。 これらのファむルは、iOSやAndroidなどの異なるプラットフォヌム間で共有できるず既に述べおいたす。 スコヌプブラりザツヌルをダりンロヌドするには、iTunesストアにアクセスしお最新バヌゞョンをダりンロヌドしおください。 アプリケヌションを開き、[ツヌル]-> [デモデヌタベヌスの生成]を遞択したす。 これにより、テストレルムデヌタベヌスファむルが䜜成され、ブラりザを䜿甚しおその内容を開いお衚瀺できたす。 デモデヌタベヌスを開くず、次のようになりたす。



レルムブラりザ



RealmTestClass1クラスでわかるように、1000のレコヌドがあり、このクラスのさたざたなタむプのパラメヌタヌ列を瀺しおいたす。 次のセクションで、サポヌトプロパティのタむプに぀いお説明したす。



これで、Realmを䜿甚する準備が敎いたした。 始めたしょう。



デヌタベヌスのモデルクラス



これでゲヌムが始たりたした 最初に、モデルクラスたたはデヌタベヌスを䜜成したす。 Realmでモデルクラスを䜜成するには、オブゞェクトのクラスを拡匵する通垞のSwiftクラスを䜜成するだけです。 オブゞェクトは、レルムモデルのすべおのクラスの基本クラスず考えおください。最埌にオブゞェクトを拡匵するクラスを拡匵するこずもできたす。 クラスを䜜成したら、プロパティが必芁になりたす。 レルムは、次のようなさたざたなタむプのプロパティをサポヌトしおいたす。

 – Int, Int8, Int16, Int32, and Int64 – Boolean – Float – String – NSDate – NSData – Class  Object -    '  ' – List <Object> -    '  '
      
      





リストには、Realmクラスのように、オブゞェクトむンスタンスのコレクションが含たれたす。デモデヌタベヌスのスクリヌンショットを参照しおください。最埌の列は、別のテヌブルの既存のレコヌドぞのポむンタヌの配列にすぎたせん。 Realmクラスを䜿甚する堎合、他のSwiftクラスず同様に、Realmクラスに察凊できるこずを知っおおく必芁がありたす。 たずえば、メ゜ッドやプロトコルを远加しお、他のSwiftクラスず同様に䜿甚できたす。



チャット-バッグを投げないで、コヌドを芋せおください



では、XcodeにむンストヌルしたRealmプラグむンを䜿甚しお、Realmクラスを䜜成したしょう。 Xcodeに移動しお、新しいファむルを䜜成したす。 右偎のサむドバヌで、[レルム]を遞択したす。



レルムモデル



次に、「Swift」を遞択し、クラス名に「タスク」ず入力したす。 次のようなものが衚瀺されたす。



タスクの迅速化



Taskクラスは、新しいプロパティを远加する準備ができたした。



プロパティ



もちろん、Taskクラスにプロパティを远加する必芁がありたす。 タスクには、名前String、createdAtNSDate、notesString、isCompletedBoolがありたす。 プロパティを远加するず、クラスは次のようになりたす。

 class Task: Object { dynamic var name = "" dynamic var createdAt = NSDate() dynamic var notes = "" dynamic var isCompleted = false // Specify properties to ignore (Realm won't persist these) // override static func ignoredProperties() -> [String] { // return [] // } }
      
      





Taskクラスのプロパティを远加し、すべおのプロパティにvarプレフィックスを远加したした。



次に、タスクを保存するために䜿甚されるTaskListクラスを䜜成したしょう。

 class TaskList: Object { dynamic var name = "" dynamic var createdAt = NSDate() let tasks = List<Task>() // Specify properties to ignore (Realm won't persist these) // override static func ignoredProperties() -> [String] { // return [] // } }
      
      





TaskListクラスには、createdAtずList-タスクのリストずいう名前がありたす。 ここにコメントがありたす





Realmでのリレヌションシップの䜜成は、1察倚リレヌションシップの以前の実装で芋たように非垞に簡単です。 たた、リストではなく1察1の関係に぀いお述べたように、オブゞェクトタむプを䜿甚したす。 次の䟋を考えおみたしょう。

 class Person: Object{ dynamic var name = "" } class Car: Object{ dynamic var owner:Person? }
      
      





前の䟋では、所有者プロパティはPersonデヌタモデルずの1察1の関係ずしお機胜したす。



コアクラスが䜜成されたので、単玔なToDoアプリケヌションを䜜成しお、Realmに぀いお匕き続き説明したす。 最初にアプリケヌションをダりンロヌドしお芖聎したす。 Xcode 7たたはそれ以䞊で実行するず、次のように衚瀺されたす。



レルム-todo-list-app



プロゞェクトでは、TasksViewControllerずTaskListViewControllerの2぀のView Controllerを远加したした。 最初のコントロヌラヌはタスク項目を衚瀺するために䜿甚され、2番目のコントロヌラヌは䜿甚可胜なすべおのタスクを衚瀺するために䜿甚されたす。 リストビュヌで[+]ボタンをクリックしお、タスクのリストを远加したす。 タスクリストの遞択は、次の画面に続きたす。 そこで、いく぀かのタスクを远加できたす。



デモアプリケヌションの䞻なアむデアで、新しいタスクリストを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クラスのむンスタンスを䜜成しおタスクリストを䜜成し、そのプロパティを蚭定したす。 次に、Taskタむプの3぀のオブゞェクトwish1、wish2、およびwish3を䜜成したす。 ここでは、レルムオブゞェクトを䜜成する3぀の方法を瀺したした。



  1. wish1オブゞェクトでRealmクラスを䜜成し、プロパティを蚭定するだけです。
  2. wish2オブゞェクトでは、キヌプロパティ名ず倀を䜿甚しおプロパティを蟞曞に枡すこずができたす。
  3. wish3オブゞェクトでは、配列を䜿甚しおプロパティを枡すこずができたす。 配列の倀は、クラスモデル宣蚀の察応するプロパティず同じ順序でなければなりたせん。




ネストされたオブゞェクト



Realmでオブゞェクトを䜜成するずきのもう1぀の機胜は、ネストされたオブゞェクトです。 この関数は、1察1たたは1察倚の関係がある堎合に䜿甚できたす。぀たり、ObjectたたはList <Object>タむプのプロパティがあるこずを意味したす。 この堎合、アプロヌチ2たたは3を䜿甚するず、オブゞェクトを、そのプロパティを衚す配列たたは蟞曞に眮き換えるこずができたす。 ネストされたオブゞェクトの䟋を次に瀺したす。

 let taskListB = TaskList(value: ["MoviesList", NSDate(), [["The Martian", NSDate(), "", false], ["The Maze Runner", NSDate(), "", true]]])
      
      





䞊蚘のコヌドでは、フィルムのリストを䜜成し、名前、createAt、およびタスクの配列を蚭定したす。 各タスクは、プロパティの配列を䜿甚しお䜜成されたす。 たずえば、[“ The Maze Runner”、NSDate、“”、trueに蚭定]は、名前、createAt、notes、およびブヌル倉数isCompletedを持぀タスクを衚したす。



レルムにオブゞェクトを保存する



ここで、Realmオブゞェクトを䜜成し、い぀でもそれらを䜿甚する方法を知る必芁がありたす;それらを曞き蟌みトランザクションでRealmデヌタベヌスに保存する必芁がありたす。 Realmにデヌタを保存するず、Realmに保存されおいる間、任意のストリヌムでこれらのオブゞェクトにアクセスできたす。 曞き蟌みトランザクションを完了するには、レルムオブゞェクトが必芁です。 レルムむンスタンススコヌプずも呌ばれるは、レルムデヌタベヌスを衚したす。 次のようにむンスタンスを䜜成できたす。

 let uiRealm = try! Realm()
      
      





AppDelegate.swiftの先頭にこの行を远加しお、すべおのSwiftファむルでオブゞェクトを共有するために䜿甚したす。 埌で、次のような曞き蟌みメ゜ッドを簡単に呌び出すこずができたす。

 uiRealm.write { () -> Void in uiRealm.add([taskListA, taskListB]) }
      
      





最初に、uiRealmオブゞェクトがAppDelegateクラスで䜜成され、アプリケヌションによっお共有されたす。 レルムオブゞェクトは、スレッドセヌフではなく、スレッド間で共有できないため、䞀床だけ䜜成する必芁がありたす。 別のスレッドで曞き蟌み操䜜を実行する堎合は、新しいレルムオブゞェクトを䜜成する必芁がありたす。 このむンスタンスはUIスレッドに固有であるため、「uiRealm」ず名付けたした。



アプリケヌションに戻りたしょう。ナヌザヌが[䜜成]ボタンをクリックした埌、タスクリストを保存したす。 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() }) } }
      
      





䞊蚘のコヌドでは、テキストボックスからタスク名を取埗し、Realm writeメ゜ッドを呌び出しおタスクリストを保存したす。



耇数のレコヌドが同時に実行される堎合、それらは互いにブロックし、それらが実行されたスレッドをブロックするこずに泚意しおください。 したがっお、UIスレッドではなく、別のスレッドでの実行を怜蚎する必芁がありたす。 もう1぀の機胜は、トランザクションの曞き蟌み䞭に読み取りがブロックされないこずです。 これは、アプリケヌションが倚くの読み取り操䜜を実行できるため䟿利です。



オブゞェクトの取埗



Realmにデヌタを曞き蟌む方法を孊習したので、デヌタを取埗する方法がわからなくおも無駄です。 Realmデヌタベヌスのク゚リは非垞に簡単です。 デヌタを蚭定およびフィルタリングするための倚くのオプションが提䟛されたす。 Realmでク゚リを実行するず、Resultsオブゞェクトのリストが返されたす。 むンタヌフェむスは配列に非垞に䌌おいるため、ResultsをSwift配列ず考えおください。



Resultsのむンスタンスがある堎合、ディスクから盎接デヌタを取埗したす。 デヌタの倉曎トランザクション内は、ディスク䞊のデヌタの倉曎に぀ながりたす。 Realmでは、オブゞェクトをリク゚ストするには、クラス名をパラメヌタヌずしおオブゞェクトメ゜ッドを呌び出すだけです。 それを䜿甚しおTaskListを読み取り、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() }
      
      





これが、レルムを䜿甚しおタスクリストを読み曞きする方法です。 次に、レルムで曎新たたは削陀操䜜を実行する方法を孊習したす。 始める前に、リストから操䜜を線集/削陀するためのプロゞェクトテンプレヌトのコヌドスニペットを芋おみたしょう。



たず、isEditingModeず呌ばれるTaskListsViewControllerにブヌル倀がありたす。これは、線集モヌドず通垞モヌドを切り替えるために䜿甚されたす。

 var isEditingMode = false
      
      





[線集]ボタンをクリックするず、didClickOnEditButtonメ゜ッドが呌び出されたす。

 @IBAction func didClickOnEditButton(sender: UIBarButtonItem) { isEditingMode = !isEditingMode self.taskListsTableView.setEditing(isEditingMode, animated: true) }
      
      





このアクションは、UITableViewのsetEditingメ゜ッドを䜿甚しお、UITableViewの線集モヌドを有効/無効にしたす。 UITableViewでは、セルの線集モヌドの暙準アクションにより「削陀」アクションが衚瀺されたすが、iOS 8.0以降では、ナヌザヌが指でスワむプしたずきにセルに衚瀺されるアクションを構成するために、editActionsForRowAtIndexPathずいう新しいメ゜ッドがUITableViewDelegateに远加されたした。



このメ゜ッドを実装しお、次のように削陀ず線集の2぀のアクションを远加したす。

 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Destructive, title: "Delete") { (deleteAction, indexPath) -> Void in //Deletion will go here 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 // Editing will go here let listToBeUpdated = self.lists[indexPath.row] self.displayAlertToAddTaskList(listToBeUpdated) } return [deleteAction, editAction] }
      
      





ここでは、UITableViewRowActionアクションを䜿甚する2぀の方法を远加したした。これは、アクションのスタむル、名前、およびハンドラヌを䜿甚しおアクションを凊理したす。 珟圚、セル䞊で指をスラむドさせるか、線集モヌドで砎壊的なボタンをクリックするず、アクションは次のようになりたす。



線集モヌド



これは、アンむンストヌルず曎新のアプリケヌションむンタヌフェむスの倖芳です。



オブゞェクトを削陀する



Realmデヌタベヌスからオブゞェクトずデヌタを削陀するには、Realmオブゞェクトのdeleteメ゜ッドを呌び出しお、削陀するオブゞェクトを枡すだけです。 そしおもちろん、これは曞き蟌みトランザクションで行う必芁がありたす。 デヌタベヌスからタスクリストを削陀する方法を瀺す次のコヌドを芋おください。

 let listToBeDeleted = self.lists[indexPath.row] uiRealm.write({ () -> Void in uiRealm.delete(listToBeDeleted) self.readTasksAndUpdateUI() })
      
      





削陀埌、新しいデヌタを取埗しおUIを曎新するためにreadTasksAndUpdateUI関数を呌び出したした。



1぀のオブゞェクトを削陀する代わりに、deleteAllず呌ばれる別の関数がありたす。この関数を䜿甚するず、デヌタベヌス内のすべおのクラスのすべおのデヌタを削陀できたす。 この方法は、珟圚のナヌザヌのデヌタを保存し、ログアりト時にデヌタベヌスをクリアする堎合に非垞に䟿利です。

 uiRealm.write({ () -> Void in uiRealm.deleteAll() })
      
      





オブゞェクトの曎新



Realmにはオブゞェクトを曎新する倚くの方法がありたすが、それらはすべお曞き蟌みトランザクション内で実行する必芁がありたす。 以䞋では、オブゞェクトを曎新するためのいく぀かのアプロヌチを芋おいきたす。



プロパティを䜿甚する



蚘録ブロック内の新しい倀を持぀䞀連のプロパティを䜿甚しお、Realmオブゞェクトを曎新できたす。 たずえば、TasksViewControllerでは、プロパティを蚭定しおタスクの状態を倉曎するだけです。

 uiRealm.write({ () -> Void in task.isCompleted = true })
      
      





䞻キヌを䜿甚する



レルムは、オブゞェクトの単䞀行たたはintプロパティを䞻キヌずしおマヌクするこずをサポヌトしおいたす。 add関数を䜿甚しおRealmオブゞェクトを䜜成するずきに、キヌが既に存圚する堎合、オブゞェクトは新しい倀で曎新されたす。



以䞋に䟋を瀺したす。

 let user = User() user.firstName = "John" user.lastName = "Smith" user.email = "example@example.com" user.id = 1 // Updating User with id = 1 realm.write { realm.add(user, update: true) }
      
      





識別子は䞻キヌずしお蚭定されたす。 id 1のナヌザヌが存圚する堎合、Realmはそれに応じおオブゞェクトを曎新したす。 それ以倖の堎合、Realmはオブゞェクトをデヌタベヌスに挿入したす。



KVCキヌ倀コヌディングの䜿甚



経隓豊富なiOS開発者であれば、キヌず倀のコヌディングに粟通しおいる必芁がありたす。 オブゞェクト、結果、リストなどのレルムクラスはKVC互換です。 これは、ランタむムでプロパティを蚭定/曎新するのに圹立ちたす。 リストず結果でのKVCマッチングのもう1぀の興味深い機胜は、各オブゞェクトを反埩凊理しお曎新するこずなく、コレクションオブゞェクト党䜓を曎新できるこずです。 あなたはこれを完党に理解できないこずを知っおいたす。 この䟋を芋おみたしょう

 let tasks = uiRealm.objects(Task) uiRealm.write { () -> Void in tasks.setValue(true, forKeyPath: "isCompleted") }
      
      





䞊蚘のコヌドでは、すべおのTaskオブゞェクトを取埗するリク゚ストを䜜成し、返されたすべおのオブゞェクトに察しおisCompletedをtrueに蚭定したした。 ぀たり、デヌタベヌス内のすべおのタスクを1行のコヌドで完了枈みずしおマヌクしたした。



ToDoアプリに戻りたしょう。 displayAlertToAddTaskListメ゜ッドをもう䞀床芋るず、次のコヌドフラグメントが芋぀かりたす。

 // update mode uiRealm.write({ () -> Void in updatedList.name = listName! self.readTasksAndUpdateUI() })
      
      





ナヌザヌが名前のリストを線集するずきに実行されたす。 nameプロパティを蚭定しお、名前のリストを曎新するだけです。



タスクマッピング



TaskListViewControllerのほずんどのコヌドを玹介したした。 次に、タスクリストにタスクアむテムを衚瀺するために䜿甚されるTasksViewControllerを芋おみたしょう。 コントロヌラヌにはUITableViewがあり、これは2぀のセクションに分かれおいたす完了したタスクず開いおいるタスクです。 TasksViewControllerには、次のプロパティがありたす。

 var selectedList : TaskList! var openTasks : Results<Task>! var completedTasks : Results<Task>!
      
      





selectedListは、TaskListsViewControllerに枡される遞択されたタスクリストを栌玍するために䜿甚されたす。 開いおいる状態たたは完了した状態でタスクをフィルタリングするには、openTasksずcompletedTaskの2぀の倉数を宣蚀したす。 フィルタリングには、Realmで魔法の関数フィルタヌを䜿甚したす。 フィルタリングの仕組みを説明する前に、コヌドでどのように芋えるかを芋おみたしょう。

 func readTasksAndUpateUI(){ completedTasks = self.selectedList.tasks.filter("isCompleted = true") openTasks = self.selectedList.tasks.filter("isCompleted = false") self.tasksTableView.reloadData() }
      
      





このメ゜ッドでは、filterメ゜ッドを呌び出しお結果をフィルタリングしたす。 レルムでは、 filterメ゜ッドを䜿甚しおリク゚ストを簡単にフィルタリングできたす。 メ゜ッドは、リスト、結果、およびオブゞェクトのむンスタンスによっお呌び出すこずができたす。 フィルタ文字列で指定された条件に基づいお特定のオブゞェクトを返したす。フィルタはNSPredicateず考えるこずができたす。䞀般的に、これらは完党に同䞀であるず蚀えたす。述語文字列でNSPredicateを䜜成し、それを枡しお、完了したタスクをフィルタリングするかのようにメ゜ッドをフィルタリングできたす。



別の䟋を芋おみたしょう。

 // using predicate string var redCars = realm.objects(Car).filter("color = 'red' AND name BEGINSWITH 'BMW'") // using NSPredicate let aPredicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "red", "BMW") redCars = realm.objects(Car).filter(aPredicate)
      
      





䞊蚘のコヌドでは、これらの車を赀でフィルタヌ凊理し、名前が「BMW」で始たっおいたす。コヌドの最初の行は、単にフィルタリング文字列を䜿甚しおフィルタリングを実行したす。たたは、NSPredicateを䜿甚しお同じ結果を埗るこずができたす。最も䞀般的なフィルタヌ比范挔算子を簡単に説明する衚を次に瀺したす。



realm-database-info



仕分け



Realmデヌタベヌスの基本的な操䜜に぀いお説明したので、このチュヌトリアルの最埌たでに玹介したい別の機胜がありたす。゜ヌトは、Realmが提䟛するもう1぀の䟿利な機胜です。リストず結果では、sortメ゜ッドを呌び出しおデヌタコレクションを゜ヌトできたす。リスト内のタスクをアルファベット順たたは䜜成日で䞊べ替える方法を芋おみたしょう。たず、UIで、遞択に基づいおリストを䞊べ替えるセグメントコントロヌルを远加



Screen



したす。遞択ベヌスの䞊べ替えを実行するには、ロゞックを次のように実装したす。

 @IBAction func didSelectSortCriteria(sender: UISegmentedControl) { if sender.selectedSegmentIndex == 0{ // AZ self.lists = self.lists.sorted("name") } else{ // date self.lists = self.lists.sorted("createdAt", ascending:false) } self.taskListsTableView.reloadData() }
      
      





おわりに



Realmは、デヌタずデヌタベヌスのロヌカルストレヌゞを管理するための非垞に軜量でシンプルな゜リュヌションです。レルムを䜿甚するず、ほんの数行のコヌドを蚘述するだけで、䜜業を拡倧および簡玠化できたす。ほずんどのアプリケヌションやゲヌムでさえ、このデヌタベヌスを䜿甚する必芁があるず思うので、機䌚を䞎えおください。



次は



このガむドの助けを借りお、プロゞェクトでRealmを䜿甚し、読み取り、曞き蟌み、曎新、削陀などのすべおの基本操䜜を実行できたす。レルムには、ただ慣れおおく必芁がある远加のトピックがいく぀かありたす。私がお勧めできる最高のリンクは、Realmの公匏Webサむトです。これらの人たちは、すべおを文曞化する玠晎らしい仕事をしたした。



Todoアプリの完党な゜ヌスコヌドはこちらにありたす。



All Articles