今回はTableViewCell移動時のCoreDataの更新と保存、その関連処理を記載します。
【 TableViewとCoreDataの初期状態】
① TableView(id1_神戸から id9_高松まで降順・入力順で表示)
※※関連処理として、TableViewの昇順・降順処理は次の通りです。《注1》
↓
1 2 |
//---------------------------------------------------------trueは入力順 .aqx let sortDescriptor = NSSortDescriptor(key: "posi", ascending: false) |
② CoreDataの内容を確認します(TableViewのソート用にposi項目を持っています)
※※関連処理としてposi項目は、id項目と同時(同様)にCoreDataに追加する際に採番します。
↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//----------aqx func insertNewObject(sender: AnyObject) { let context = self.fetchedResultsController.managedObjectContext let entity = self.fetchedResultsController.fetchRequest.entity! let newSampleEntity = NSEntityDescription.insertNewObjectForEntityForName("SampleEntity", inManagedObjectContext: context) as! SampleEntity newSampleEntity.id = NSNumber(int: self.getNextId()) newSampleEntity.name = "id"+newSampleEntity.id!.stringValue + "_" + myText.text newSampleEntity.posi = NSNumber(int: self.getNextId()) newSampleEntity.time = NSDate() //"Save"ボタンでKeyboadを隠す.aqx myText.resignFirstResponder() // Save the context .aqx var error: NSError? = nil if !context.save(&error) { abort() } } func getNextId() -> Int32 { let context = self.fetchedResultsController.managedObjectContext let entity = self.fetchedResultsController.fetchRequest.entity let fetchRequest = NSFetchRequest() fetchRequest.entity = entity let keyPathExpression = NSExpression(forKeyPath: "id") let maxExpression = NSExpression(forFunction: "max:", arguments: [keyPathExpression]) let description = NSExpressionDescription() description.name = "maxId" description.expression = maxExpression description.expressionResultType = .Integer32AttributeType fetchRequest.propertiesToFetch = [description] fetchRequest.resultType = .DictionaryResultType if let results = context.executeFetchRequest(fetchRequest, error: nil) { if results.count > 0 { let maxId = results[0]["maxId"] as! Int return maxId + 1; } } return 1 } |
【 TableViewの移動とCoreDataの更新】
③ TableView(id1_神戸をid3_京都の上に移動)
④ TableView移動後のCoreDataの内容を確認します(神戸のposi項目が1から3に変更され、大阪・京都ともにposi項目が更新されています)
posi項目が変更される事によりTableViewの表示順を対応する事ができます。《注》参照
⑤ CoreDataの更新処理
TableViewの移動を行う時に移動対象となるCoreDataのposi項目を更新する事でTableViewの移動表示を行う事は今までにふれてきました。
では実際に処理を記述するのですが、今回の記述例では以下のような手順が必要になります。
1. 移動元と移動先のposiを比較する
2. 移動元が大きい場合の処理と小さい場合の処理をおこなう
3. 処理は移動元だけではなく関係する前後のCoreDataのposiを含めて更新をおこなう
等…
それぞれのswiftコードを記述すると長くなりますので、今回は 1.の移動元と移動先のposiを比較する処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { //let context = self.fetchedResultsController.managedObjectContext let contextTo = self.fetchedResultsController.objectAtIndexPath(destinationIndexPath) as! SampleEntity myToobject = contextTo.posi let contextFrom = self.fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! SampleEntity myFromobject = contextFrom.posi myToInt = myToobject.intValue myFromInt = myFromobject.intValue myGetInt = myFromInt mySetInt = myFromInt if myFromInt < myToInt { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate if let managedObjectContext = appDelegate.managedObjectContext { let entityDiscription = NSEntityDescription.entityForName("SampleEntity", inManagedObjectContext: managedObjectContext); let fetchRequest = NSFetchRequest(); fetchRequest.entity = entityDiscription; let predicate = NSPredicate(format: "%K = %@", "posi", myFromobject) fetchRequest.predicate = predicate var error: NSError? = nil; if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) { for managedObject in results { let model = managedObject as! SampleEntity; // model.posi = 0 // } } // AppDelegateクラスに自動生成された saveContext で保存完了 appDelegate.saveContext() } myCalculationAdd() if let managedObjectContext = appDelegate.managedObjectContext { let entityDiscription = NSEntityDescription.entityForName("SampleEntity", inManagedObjectContext: managedObjectContext); let fetchRequest = NSFetchRequest(); fetchRequest.entity = entityDiscription; myBackInt = 0 myBackobject = NSNumber(int: myBackInt) let predicate = NSPredicate(format: "%K = %@", "posi", myBackobject) fetchRequest.predicate = predicate var error: NSError? = nil; if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) { for managedObject in results { let model = managedObject as! SampleEntity; // model.posi = myToobject // } } appDelegate.saveContext() self.tableView.reloadData() // reloadDataにより表示の整合性を保つ } } else if myFromInt > myToInt { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate if let managedObjectContext = appDelegate.managedObjectContext { let entityDiscription = NSEntityDescription.entityForName("SampleEntity", inManagedObjectContext: managedObjectContext); let fetchRequest = NSFetchRequest(); fetchRequest.entity = entityDiscription; let predicate = NSPredicate(format: "%K = %@", "posi", myFromobject) fetchRequest.predicate = predicate var error: NSError? = nil; if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) { for managedObject in results { let model = managedObject as! SampleEntity; // model.posi = 0 // } } appDelegate.saveContext() } myCalculationSub() if let managedObjectContext = appDelegate.managedObjectContext { let entityDiscription = NSEntityDescription.entityForName("SampleEntity", inManagedObjectContext: managedObjectContext); let fetchRequest = NSFetchRequest(); fetchRequest.entity = entityDiscription; myBackInt = 0 myBackobject = NSNumber(int: myBackInt) let predicate = NSPredicate(format: "%K = %@", "posi", myBackobject) fetchRequest.predicate = predicate var error: NSError? = nil; if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) { for managedObject in results { let model = managedObject as! SampleEntity; // model.posi = myToobject // } } appDelegate.saveContext() self.tableView.reloadData() // reloadDataにより表示の整合性を保つ. } } //----- aqx. } |
※※Cellの移動を行う時はreloadDataで表示の整合性を保つ事をわすれずに。
- 投稿タグ
- Swift