2016-06-19 7 views
8

W swift wcześniej, byłem w stanie użyć takiego kodu, aby dodać nowe dane do mojego "TestEntity" w moim modelu danych.Jak wstawić nowe dane do encji w Swift3?

NSManagedObject został stworzony dla mojego „TestEntity” i udało mi się ustawić jego atrybuty z „kropka” składni

Na koniec, chciałbym zapisać kontekst

let entity=NSEntityDescription.insertNewObject(forEntityName: "TestEntity", into: context) as! TestEntity 
entity.testAttribute="test value" 
context.save() 

Ten kod nie działa pracować w Swift3. Kiedy go uruchomić, pojawia się następujący błąd wykonania:

Could not cast value of type 'NSManagedObject_TestEntity_' (0x175306b0) to 'testCoreData.TestEntity' (0xd6bb8). 2016-06-19 11:07:52.305195 testCoreData[689:264453] Could not cast value of type 'NSManagedObject_TestEntity_' (0x175306b0) to 'testCoreData.TestEntity' (0xd6bb8)

Czy ktoś może rzucić nieco światła na to, jak powinno być zrobione w swift3, proszę? Każda pomoc jest wysoko ceniona. Dziękuję.

Druga część pytania dotyczy sposobu ponownego dostępu do danych. następujący kod kończy się błędem: błąd krytyczny: NSArray elementem udało się dopasować Swift tablicę typu elementu

let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest() 

do { 
    let searchResults=try context.fetch(fr) 
    if let results=searchResults { 
     for result in results { 
     print("testAtt = \(result.testAtt)") 
     } 
    } 
} catch { 

} 

Odpowiedz

4

Jeśli istnieje NSManagedObject podklasa TestEntity nowa składnia jest

let entity = TestEntity(context: context) 
entity.testAttribute="test value" 
+0

Zapisywanie musi być zawijane w bloki "try-catch". – Mundi

+0

@Mundi Tak, oczywiście, ale nie ma to znaczenia dla pytania. Usunąłem linię. – vadian

+0

Musiałem utworzyć NSEntityDescription dla powyższego kodu do pracy. bez niego wystąpił kolejny błąd środowiska wykonawczego: Przerywanie aplikacji z powodu nieprzechwyconego wyjątku "NSInvalidArgumentException", powód: "Klasa NSManagedObject klasy" testCoreData.TestEntity "musi mieć prawidłowy identyfikator NSEntityDescription." 'let entityDes = NSEntityDescription.entity (forEntityName:" TestEntity ", w: context) niech entity = TestEntity (entity: entityDes !, insertInto: context) entity.testAtt =" atrybut testowy "' Ale potem zadziałało. Dziękuję Ci. – matyasl

1

przykład praca:

let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest() 
    do { 
     let results=try self.moc!.fetch(fr) 
     if results.count==0 { 
      print("no resutls. i need to add something") 
      let newTestEntity=TestEntity(context: self.moc!) 
      newTestEntity.testAtt="testovaci text" 
      do { 
       try self.moc!.save() 
      }catch{ 

      } 
     }else{ 
      print("already some results") 
      for result in results { 
       print(result.testAtt!) 
      } 
     } 
    }catch { 
     print(error) 
    } 

Inspektor modeli danych TestEntity Nazwa klasy musi być ustawiona na TestEntity. Poprzednie dziwne zachowanie wydawało się być spowodowane tym, że ta wartość była pusta.

3
//retrieve the entity 
let entity = NSEntityDescription.entity(forEntityName: "TestEntity", in: context) 

let testEntity = NSManagedObject(entity: entity!, insertInto: context) 

//set the entity values 
testEntity.setValue(testAtt1, forKey: "testAtt1") 
testEntity.setValue(testAtt2, forKey: "testAtt2") 

//save the object 
do { 
    try context.save() 
    print("saved!") 
} catch let error as NSError { 
    print("Could not save \(error), \(error.userInfo)") 
} catch { 

} 
+0

Nie można załadować klasy o nazwie "NazwaProgramu.NazwaWzródła" dla encji "NazwaPrzymiotu". Klasa nie została znaleziona, zamiast tego używa domyślnego obiektu NSManagedObject. – mumu

Powiązane problemy