Ios 保存上下文时不会将项目添加到核心数据

Ios 保存上下文时不会将项目添加到核心数据,ios,swift,core-data,Ios,Swift,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, n

我正在尝试构建一个核心数据应用程序,我正在使用一些基于书本的代码

为了简化代码,我有如下内容:

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!))
    }
}
编辑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

如评论/聊天中所述:

  • 请记住,CoreData SQLite数据库的默认日志模式使用WAL模式,因此您需要确保任何sql读取器都能识别这些文件。在代码中使用fetch通常比直接读取sqlite文件更容易
  • 尝试使用SQLDebug模式查看实际从sqlite读取/写入的内容
  • 在本例中,您的获取请求中有一个默认谓词,它排除了您保存的所有对象;删除谓词表明数据已存在,并且保存工作正常

  • 您如何/在何处创建您的上下文?它是连接到持久存储协调器的主队列并发上下文吗?您是如何检查sqlite文件的?您是否尝试执行提取以确认数据库为空?@SeanCAtkinson:是的,它是一个MainQueueConcurrencyType,并且还连接到一个持久存储协调器。我正在我的主视图控制器中创建它,并将其传递给其他视图控制器。@pbasdf:我使用sql reader软件进行了检查。但是当我第一次运行应用程序时,我正在尝试获取它们。您的sql阅读器是否使用WAL和SHM文件以及.sqlite?
    -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