1
コアデータアプリケーションを作成しようとしていて、thisに基づいてコードを使用しています。コンテキストを保存するときに項目がコアデータに追加されない
私はこのような何か持っているコードを簡素化するには、次の
class City: NSManagedObject {
@NSManaged public private(set) var name: String
@NSManaged public private(set) var population: Int
public static func insert(context: NSManagedObjectContext, name: String, population: Int) -> City {
let city: City = context.insertObject()
city.name = name
city.population = population
return city
}
}
extension NSManagedObjectContext {
public func insertObject<A: NSManagedObject>() -> A {
guard let obj = NSEntityDescription.insertNewObjectForEntityForName("City", inManagedObjectContext: self) as? A else {
fatalError("Wrong object type")
}
return obj
}
public func saveOrRoleback() -> Bool {
do {
try save()
return true
} catch {
rollback()
return false
}
}
public func performChanges(block:() ->()) {
performBlockAndWait {
block()
print(self.saveOrRoleback())
}
}
}
func addCity() {
self.context.performChanges {
City.insert(self.context, name: self.name.text!, amount: Int(self.population.text!))
}
}
私は新しい都市を追加し、save()
は、文脈上saveOrRollback()
メソッド内で呼び出されると、私はエラーを取得しないが、それはtrueを返します。
しかし、データが追加されていません。私はSQLファイルをチェックしようとし、空です。
コアデータを初めて使う人は、どこで問題を探すか教えていただけますか?私は保存時にエラーや何かを得ることを期待していたが、すべてが正常であるように見えるが、データベースは常に空である。
編集: - 追加コアデータ・セットアップ
public func createContext() -> NSManagedObjectContext {
let context = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
context.persistentStoreCoordinator = createStoreCoordinator()
return context
}
private func createStoreCoordinator() -> NSPersistentStoreCoordinator {
let psc = NSPersistentStoreCoordinator(managedObjectModel: model.managedObjectModel)
try! psc.addPersistentStoreWithType(model.storeType.type, configuration: nil, URL: model.storeURL, options: nil)
return psc
}
// Main VC
override func viewDidLoad() {
super.viewDidLoad()
let model = CoreDataModel(modelName: modelName, modelBundle: modelBundle!, storeType: .SQLite(DocumentsDirectoryURL()))
let factory = CoreDataFactory(model: model)
context = factory.createContext()
self.todayViewController = storyboard?.instantiateViewControllerWithIdentifier("TodayViewController") as! TodayViewController
self.todayViewController.context = context
}
編集2: - SQLのデバッグ、コメントで説明したようにデータ
-06-18 22:31:15.042 Savings+[1100:39698] CoreData: sql: BEGIN EXCLUSIVE
2016-06-18 22:31:15.043 Savings+[1100:39698] CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
2016-06-18 22:31:15.043 Savings+[1100:39698] CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
2016-06-18 22:31:15.043 Savings+[1100:39698] CoreData: sql: COMMIT
2016-06-18 22:31:15.045 Savings+[1100:39698] CoreData: sql: BEGIN EXCLUSIVE
2016-06-18 22:31:15.045 Savings+[1100:39698] CoreData: sql: INSERT INTO ZTRANSACTION(Z_PK, Z_ENT, Z_OPT, ZAMOUNT, ZDATE, ZNAME, ZTYPE) VALUES(?, ?, ?, ?, ?, ?, ?)
2016-06-18 22:31:15.045 Savings+[1100:39698] CoreData: sql: COMMIT
2016-06-18 22:31:15.046 Savings+[1100:39698] CoreData: sql: pragma page_count
2016-06-18 22:31:15.046 Savings+[1100:39698] CoreData: annotation: sql execution time: 0.0003s
2016-06-18 22:31:15.046 Savings+[1100:39698] CoreData: sql: pragma freelist_count
どのようにコンテキストを作成していますか?永続ストアコーディネータにアタッチされたメインキュー並行コンテキストですか? – SeanCAtkinson
どのようにsqliteファイルを調べましたか?フェッチを実行してデータベースが空であることを確認しようとしましたか? – pbasdf
@SeanCAtkinson:はい、それはMainQueueConcurrencyTypeであり、永続ストアコーディネータにも関連付けられています。私はメインビューコントローラでそれを作成し、それを他のビューコントローラに渡しています。 – Kobe