2014-12-11 2 views
0

SWIFT에서 핵심 데이터로 쓰고 읽으려고합니다. 새로운 데이터를 작성하고 기존 데이터를 읽는 데는 모든 것이 좋습니다. 하지만 지금은 레코드를 업데이트하고 싶습니다. ("pagina"가 "1"이라고 말하면됩니다.) 갑자기 완전히 잃어버린 느낌입니다! 그것이 가장 좋은 방법이라고 생각하기 때문에 배치 업데이트를 살펴 보았습니다. 불행히도 내가 찾은 자습서 중 아무 것도 나를 위해 충분하지 않은 것 같습니다.코어 데이터로 속성을 업데이트하는 방법

엔티티 "스토리"를 만들고 "pagina"(String), "plaats"(String) 및 "naam"(String)의 세 가지 속성을 추가했습니다. 이 작업을 수행하는 방법은 txtPagina.text에서 페이지 번호를 검색하여 Pagina 변수에 저장하는 것입니다. 그런 다음 txtPlaats.text 및 txtNaam.text의 UITextField 내용으로 레코드를 업데이트합니다. 여기서 pagina = Pagina. 그것은 충분히 간단 해 보인다. 불행히도 배치 업데이트를 파악할 수 없습니다. 아무도 도와 줄 수 있습니까? 나는 여기서 완전히 잃어 버렸어.

@IBAction func btnSave(){ 

    var Pagina = txtPagina.text 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
    var context:NSManagedObjectContext = appDel.managedObjectContext! 

    //check if data exists 
    var request = NSFetchRequest(entityName: "Stories") 
    var results:NSArray = context.executeFetchRequest(request, error:nil)! 

    if(results.count > 0) { 
     Pagina = "\(results.count)" 
     txtPagina.text = Pagina 

     //code to update plaats and naam where pagina = Pagina 

    } else { 
     var newStory = NSEntityDescription.insertNewObjectForEntityForName("Stories", inManagedObjectContext: context) as NSManagedObject 
     newStory.setValue(Pagina, forKey: "pagina") 
     newStory.setValue("\(txtPlaats.text)", forKey: "plaats") 
     newStory.setValue("\(txtNaam.text)", forKey: "naam") 

     context.save(nil) 

     println(newStory) 
     println("Object Saved.") 
    } 

}

+0

무엇이 문제입니까? 이게 효과가있는 것처럼 보입니다. 한 가지 제안은'newStory'를'Stories' 객체로 취급하여 setVale 대신에'newStory.pagina = Pagina'와 같은 것을 쓸 수있게하는 것입니다. – oltman

+0

위의 코드에는 아무 문제가 없습니다. 그러나 insertNewObjectForEntityForName은 기존 속성을 업데이트하지 않고 새 속성 만 추가합니다. 속성을 업데이트하는 방법이 있습니까? – etimm

+0

'insertNewObjectForEntityForName'은 정확하게 말합니다 - 새 객체를 삽입합니다. 이미 생성 된 객체를 업데이트하고자한다면'results' 배열에있는 항목에 값을 설정해야합니다. – oltman

답변

0

내가 지금 일하고 뭔가있어,하지만 난 그게 가장 효율적인 방법 확실하지 않다 :

I 클래스라는 이야기를 만들었습니다

import UIKit 
import CoreData 

@objc(Stories) 
class Stories: NSManagedObject { 
    @NSManaged var pagina:String 
    @NSManaged var plaats:String 
    @NSManaged var naam:String  
} 

이제 내 btnSave 조치는 this :

@IBAction func brnSave(sender: AnyObject) { 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
    var context:NSManagedObjectContext = appDel.managedObjectContext! 
    var request = NSFetchRequest(entityName: "Stories") 
    var results:NSArray = context.executeFetchRequest(request, error: nil) as [Stories] 
    if (results.count > 0) { 
     println(results.count) 
     if (results.count >= txtPagina.text.toInt()) { 
     for res in results{ 
      var data = res as Stories 
      println(data.plaats) 
      if (data.pagina == txtPagina.text) { 
       data.plaats = txtPlaats.text 
       data.naam = txtNaam.text 
       context.save(nil) 
       println("Page \(data.pagina) updated") 
       } 
      } 
     } else { 
      // Save new Story 
      var ent = NSEntityDescription.entityForName("Stories", inManagedObjectContext: context) 
      var newStory = Stories(entity: ent!, insertIntoManagedObjectContext: context) 
      newStory.pagina = txtPagina.text 
      newStory.plaats = txtPlaats.text 
      newStory.naam = txtNaam.text 
      context.save(nil) 
      println("New story saved") 
      // Save new Story end 

     } 

    } else { 

     // Save new Story 
     var ent = NSEntityDescription.entityForName("Stories", inManagedObjectContext: context) 
     var newStory = Stories(entity: ent!, insertIntoManagedObjectContext: context) 
     newStory.pagina = txtPagina.text 
     newStory.plaats = txtPlaats.text 
     newStory.naam = txtNaam.text 
     context.save(nil) 

     println(newStory) 
     println("New story saved") 
     // Save new Story end 

    } 
} 

코드는 작동하지만 완벽하지는 않습니다. 더 효율적으로 만들 수있는 방법이 있습니까? 배열을 업데이트 할 때 기본적으로 변경된 데이터를 업데이트하는 대신 전체 coredata 테이블을 다시 작성합니다. 나는 더 많은 데이터가있을 때 이것이 현명한 수행을하는 것을 상상할 수 있습니다!

0

당신이 가지고있는 유일한 문제는 기록을 갱신하는 경우, 그것은 당신의 문제는 당신이 그것을 업데이트 한 후 context.save()에 호출을하지 않는 것입니다 것처럼 보인다. 이것은 그 문제를 해결해야합니다.

관련 문제