2017-05-08 4 views
1

コアデータエンティティのデータを更新する機能を設定しようとしています。特定のコンテキストを表示してデータを変更することはできますが、保存をクリックすると古いものを上書きするのではなく新しいコンテキストが作成されます。次のように私のコードは次のとおりです。コアデータエンティティのスウィフト更新データ

輸入のUIKit インポートCoreData

クラスRoomDetailTableViewController:のUITableViewController、UINavigationControllerDelegate、UIImagePickerControllerDelegate {

@IBOutlet weak var roomImageView: UIImageView! 
@IBOutlet weak var roomNameTextField: UITextField! 


@IBOutlet weak var rmLengthFt: UITextField! 
@IBOutlet weak var rmLengthInches: UITextField! 
@IBOutlet weak var rmWidthFt: UITextField! 
@IBOutlet weak var rmWidthInches: UITextField! 

let appDelegateObj : AppDelegate = UIApplication.shared.delegate as! AppDelegate 


var managedObjectContext: NSManagedObjectContext? { 
    return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
} 

var roomArray = [Rooms]() 
var arrayElement: Int = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    retrieveRooms() 
    setSaveBarButton() 
    if arrayElement != 2112 { //Kludgy****** 

    updateRoom() 
    } 

} 


func setSaveBarButton(){ 

    let saveBarButton = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(RoomDetailTableViewController.saveRoom)) 
    navigationItem.rightBarButtonItem = saveBarButton 



} 

func updateRoom(){ 
    let room = self.roomArray[arrayElement] 


    self.roomNameTextField.text = room.roomName 
    self.roomImageView.image = UIImage(data: room.roomImage! as Data) 

} 


@IBAction func pickRoomImage(_ sender: UITapGestureRecognizer) { 


    let pickerController = UIImagePickerController() 
    pickerController.delegate = self 
    pickerController.allowsEditing = true 

    let alertController = UIAlertController(title: "Add a Picture", message: "Choose From", preferredStyle: .actionSheet) 

    let cameraAction = UIAlertAction(title: "Camera", style: .default) { (action) in 
     pickerController.sourceType = .camera 
     self.present(pickerController, animated: true, completion: nil) 

    } 
    let photosLibraryAction = UIAlertAction(title: "Photo Library", style: .default) { (action) in 
     pickerController.sourceType = .photoLibrary 
     self.present(pickerController, animated: true, completion: nil) 

    } 

    let savedPhotosAction = UIAlertAction(title: "Saved Photos Album", style: .default) { (action) in 
     pickerController.sourceType = .savedPhotosAlbum 
     self.present(pickerController, animated: true, completion: nil) 

    } 

    let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: nil) 

    alertController.addAction(cameraAction) 
    alertController.addAction(photosLibraryAction) 
    alertController.addAction(savedPhotosAction) 
    alertController.addAction(cancelAction) 


    present(alertController, animated: true, completion: nil) 

} 


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    self.dismiss(animated: true, completion: nil) 

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     self.roomImageView.image = image 

    } 
} 

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    picker.dismiss(animated: true, completion: nil) 
} 

func saveRoom(){ 

    if roomNameTextField.text!.isEmpty || roomImageView.image == nil { 

     let alertController = UIAlertController(title: "Room Name", message: "Pleae provide data", preferredStyle: .alert) 

     alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     self.present(alertController, animated: true, completion: nil) 


    } else { 

     //Let's save 
     if let moc = managedObjectContext { 
      let room = Rooms(context: moc) 
      room.roomName = roomNameTextField.text! 
      room.rmLengthFt = rmLengthFt.text! 
      room.rmLengthInches = rmLengthInches.text! 
      room.rmWidthFt = rmWidthFt.text! 
      room.rmWidthInches = rmWidthInches.text! 

      if let data = UIImageJPEGRepresentation(self.roomImageView.image!, 1.0) { 
       room.roomImage = data as NSData 
      } 

      saveToCoreData() { 
       self.navigationController!.popToRootViewController(animated: true) 
      } 


     } 
    } 

} 


func saveToCoreData(completion: @escaping()->Void){ 
    managedObjectContext!.perform { 

     var error: NSError? 
     do { 
      try self.managedObjectContext?.save() 
      completion() 
     } catch let error1 as NSError { 
      error = error1 
     } 

     //Check for any errors 

     if let err = error { 

      let a = UIAlertController(title: "Error", message: err.localizedFailureReason, preferredStyle: .alert) 
      self.present(a, animated: true) 
     } else { 


      print("Room saved to CoreData") 

     } 

    } 

} 

func retrieveRooms(){ 
    fetchRoomsFromCoreData { (rooms) in 
     if let rooms = rooms{ 
      self.roomArray = rooms 
      self.tableView.reloadData() 
     } 
    } 
} 

func fetchRoomsFromCoreData(completion: ([Rooms]?)->Void){ 
    var results = [Rooms]() 
    let request: NSFetchRequest<Rooms> = Rooms.fetchRequest() 
    do { 
     results = try managedObjectContext!.fetch(request) 
     completion(results) 
    }catch { 
     print("Could not fetch Rooms from CoreData:\(error.localizedDescription)") 
    } 
} 

}

私は私がと私の命名法は、おそらく不正確である知っていますコアデータを扱うことを学ぶだけです。

ご協力いただければ幸いです。

答えて

1

私は、既存のエンティティを変更したいときに新しいエンティティを作成していると思います。新しいエンティティを作成している

let room = Rooms(context: moc) 

の代わりに、データの入力に使用したものと同じエンティティにアクセスする必要があります。何かのようなlet room = self.roomArray[arrayElement]。私があなたのコードを理解していないか、番号2112が呪われてしまうような邪悪なことが起こったとして、さらにコメントするのは難しいです。 (if arrayElement != 2112 WTF!)

+0

@JonIは、私は、エンティティを更新まわりで私の頭をラップしながら、流れるようにプログラムを取得する(一時的な)その場しのぎを知っています。 2112の背後にある私の理由は、私が家にその部屋の近くにいる人は誰も予想していないということです。プラス私はラッシュのファンですので、私はより良いアプローチを把握しながら作業するために安全な思い出に残る数のように思えました。 – soundChaser