핵심 데이터

만약 정보를 영구화된 프로그램에 입력한 적이 있다면, 이 정보는 온라인 서버에 저장되지 않았을 것이다.
핵심 데이터는 응용 프로그램의 데이터를 저장, 편집, 삭제할 수 있으며, 응용 프로그램은 데이터 저장소 안에 있다.정보는 객체로서 핵심 데이터에 저장됩니다. 이러한 객체는 서로 다른 유형의 여러 속성과 행동을 확인할 수 있는 다른 객체와의 관계를 가질 수 있습니다.
핵심 데이터에 대해 많은 것을 할 수 있지만 본 강좌는 데이터 모델 만들기, 위탁 관리 대상의 상하문과 지속적인 저장, 저장 및 편집, 삭제 등 기초 지식을 중점적으로 소개할 것입니다.사용자 정의 인사말을 제공하는 데 사용할 이름을 입력할 수 있는 아주 간단한 프로그램을 만들 것입니다.
먼저 새 단일 보기 항목을 만들지만'핵심 데이터 사용'상자를 선택하지 않았는지 확인하십시오.우리는 그런 견본이 필요하지 않도록 자신의 코드를 작성할 것이다.
Core Data
이제 프로젝트가 생겼습니다. 데이터 모델을 만듭니다.새 파일을 만들고 데이터 모델을 유형으로 선택합니다(찾기 위해 아래로 스크롤).

데이터 모델을 만들면 모델에 실체를 추가할 수 있는 화면이 보일 것입니다.아래쪽에 있는 솔리드 추가를 클릭합니다.

현재 왼쪽 목록에 실체가 있습니다.이름을 두 번 클릭하고 의미 있는 내용으로 변경합니다.나는 나의 이름을 SavedData로 명명할 것이다.현재 우리의 실체는 구조가 속성이 있는 것처럼 핵심 데이터 실체는 값을 저장하는 방법이 필요하다.
빈 속성 목록에서 더하기 기호를 클릭하거나 뷰 아래쪽에 있는 더하기 기호를 클릭합니다.엔티티에 빈 속성이 추가됩니다.우리는 여기에 이름을 저장할 계획이다. 따라서 속성에 적당한 제목과 문자열 형식을 줄 것이다.다음은 현재 우리의 업무입니다.

우리의 실체는 매우 간단하기 때문에 이 단계는 이미 완성되었다.관리자를 추가해서 managedObjectContext와persistentContainer를 처리할 때가 되었습니다.이것들은 우리의 코드를 핵심 데이터 모델에 연결하고 실제로 사용할 수 있도록 한다.
CoreDataManager라는 새 Swift 파일을 추가합니다.파일의 맨 위에 CoreData를 가져오는지 확인합니다.우리는 같은 이름의 클래스를 만들 것이다.
class CoreDataManager {
      static var shared = CoreDataManager()
}
공유는 이 대상을 하나의 단독 대상으로 만든다. 이것은 하나의 대상으로만 존재하고 어느 곳에서든 접근할 수 있음을 보장한다.현재 CoreDataManager 클래스에 managedObjectContext와persistentContainer를 추가합니다. 이 두 변수는 모두 타성 변수로 표시되기 때문에 필요하기 전에는 실례화되지 않습니다.
lazy var managedObjectContext: NSManagedObjectContext = { [unowned self] in
        var container = self.persistentContainer
        return container.viewContext
        }()

    private lazy var persistentContainer: NSPersistentContainer = {
        var container = NSPersistentContainer(name: "Model")

        container.loadPersistentStores() { storeDescription, error in
            if var error = error as NSError? {
                fatalError("unresolved error \(error), \(error.userInfo)")
            }

            storeDescription.shouldInferMappingModelAutomatically = true
            storeDescription.shouldMigrateStoreAutomatically = true
        }

        return container
}()
컨테이너 이름은 데이터 모델의 이름과 일치합니다. 다른 이름을 선택한 경우 여기에 사용하십시오.NSPersistentContainer는 모델 및 컨텍스트에 대한 액세스를 처리하고 NSManagedObjectContext는 변경 사항을 처리합니다.managedObjectContext는 인용 순환을 방지하기 위해 [unowned self]로 설명합니다.
CoreDataManager를 만들면 나머지 코드를 설정할 수 있습니다.우선, 우리는 불러오는 데이터를 저장하는 구조를 만들 것이다.
struct Name {
    static var loaded: SavedData?
}
정적 변수는 이전에 생성된 솔리드 유형 SavedData의 선택적 변수입니다.managedObjectContext에서 불러올 때 SavedData의 실례가 있으면 정적 변수에 추가합니다.그리고loaded가nil인지 확인하면 불러오는 이름이 있는지 알 수 있습니다.
ViewController에 추가된 저장 코드는 불러온 데이터(존재하는 경우)를 loaded에 배치하고 이름을 사용하기 위해 인사말 탭을 변경합니다.fetch는 이 예에서 SavedData 실체를 검색할 실체 이름을 사용할 것을 요청합니다.fetch가 그룹의 데이터를 되돌려 달라고 요청하기 때문에, 첫 번째 항목에 접근해야만 SavedData 대상을 얻을 수 있습니다.이것도 우리가 처음으로 명칭 구조에서 불러오는 변수를 사용한 것이다.
func loadName() {
          var managedContext = CoreDataManager.shared.managedObjectContext
          var fetchRequest = NSFetchRequest(entityName: "SavedData")

          do {
              var result = try managedContext.fetch(fetchRequest)
              if let data = result.first {
                  Name.loaded = data
                  updateGreeting()
              }
              print("loaded")

          } catch let error as NSError {
              // handle error
          }
     }
viewDidLoad에서 loadName을 호출하면 저장되었는지 확인하고 인사말 탭을 업데이트합니다.저장 버튼 제목도 변경되어 기존 이름이 존재하고 새로 입력한 이름은 이전 이름을 덮어씁니다.그러나 첫 번째 프로그램이 발표됨에 따라 사용자가 입력할 때까지 이름 정보가 불러오지 않습니다.
일부 내용을 불러올 수 있도록 사용자가 이름을 입력하고'이름 저장'단추를 누르면 저장 작업을 실행해야 합니다.다음은 제가 사용하고 있는 코드입니다. 상기 업데이트 인사말을 포함하여 이름이 바뀔 때마다 이 함수를 실행합니다.
func updateGreeting() {
     if let name = Name.loaded?.name {
          greetingLabel.text = "Hello \(name)!"
              saveButton.setTitle("   Resave Name   ", for: .normal)
     } else {
          greetingLabel.text = "Hello!"
          saveButton.setTitle("   Save Name   ", for: .normal)
     }
}

  func saveName() {
          var managedContext = CoreDataManager.shared.managedObjectContext

          // if there is no text in the textField, don't continue
          guard let enteredText = textField.text else { return }

          guard let currentName = Name.loaded else {
              let nameSave = SavedData(context: managedContext)

              nameSave.name = enteredText
              Name.loaded = nameSave

              do {
                  try managedContext.save()
                  print("saved")
              } catch {
                  // handle errors
              }

              updateGreeting()
              textField.text = nil
              return
          }

          currentName.name = enteredText
          Name.loaded = currentName

          do {
              try managedContext.save()
              print("saved")
          } catch {
              // handle errors
          }

          updateGreeting()
          textField.text = nil
}
이 저장 함수는 먼저 textField에 유효한 텍스트가 있는지 확인합니다. - 비어 있으면 저장 프로세스를 되돌려주고 종료하고 싶습니다.그리고 이 함수는 이름이 정확한지 확인합니다.보호문을 사용하여nil로 불러옵니다.만약 그렇다면, 새 SavedData 실체를 만들고 (이 예에는 현재 실체가 존재하지 않기 때문에) 저장한 다음 돌아올 때 종료합니다.If 이름.loaded는 nil이 아닙니다. (즉currentName에 값이 있습니다.) 그리고currentName에서 이름을 다시 지정한 다음 저장합니다.이 두 경로의 끝에 인사말이 업데이트되고 텍스트 필드 텍스트가 재설정되어 다른 이름을 쉽게 입력할 수 있습니다.
마지막으로, 우리는 이름을 완전히 삭제하는 함수가 필요하다.
func deleteName() {
          var managedContext = CoreDataManager.shared.managedObjectContext

          guard let toDelete = Name.loaded else { return }
          managedContext.delete(toDelete)

          do {
              try managedContext.save()
              print("delete successful")
          } catch {
              print("Failed to save")
          }

          Name.loaded = nil
          updateGreeting()
}
삭제 단추를 눌렀을 때 이 함수를 호출합니다.If 이름.loaded에 값이 없으면 함수가 되돌아올 때 종료됩니다. 삭제할 내용이 없기 때문입니다.삭제가 완료되면 이름을 지정합니다.기존 저장소가 더 이상 존재하지 않기 때문에loaded는nil로 리셋됩니다.
프로그램을 실행하고 나처럼 모든 인터페이스를 설정하면 이름을 입력하면 탭이 바뀌는 것을 볼 수 있습니다. 새 이름을 입력하면 이전 이름을 덮어쓰거나 삭제할 수 있습니다.이름을 입력하고 저장한 다음 프로그램을 다시 시작하면 불러옵니다. 이름이 있는 인사말이 화면에 표시됩니다.
이것은 핵심 데이터 역량의 일부분인 지속성이다.자신의 모델을 사용하면 더욱 복잡한 모델을 만들고 대상 관계를 이용하는 것을 배울 수 있습니다!즐거운 인코딩!

좋은 웹페이지 즐겨찾기