簡體   English   中英

保存上下文時,項目不會添加到核心數據

[英]Items are not added to Core Data when saving context

我正在嘗試構建一個 Core Data 應用程序,並且我正在使用一些基於本書的代碼。

為了簡化代碼,我有這樣的事情:

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 文件並且是空的。

作為 Core Data 的新手,有人可以指出我在哪里尋找問題嗎? 原以為保存的時候會報錯什么的,但是好像一切正​​常,但是數據庫一直都是空的。

編輯: - 添加了核心數據設置

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

正如評論/聊天中所討論的:

  1. 請記住,CoreData SQLite 數據庫的默認日志模式使用 WAL 模式,因此您需要確保任何 sql reader 都能識別這些文件。 在代碼中使用 fetch 通常比直接讀取 sqlite 文件更容易。
  2. 嘗試使用 SQLDebug 模式查看實際從/向 sqlite 讀取/寫入的內容。
  3. 在這種情況下,您的提取請求有一個默認謂詞,它排除了您保存的所有對象; 刪除謂詞表明數據在那里並且您的保存工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM