**更新#** 3:另一条线索......我的应用程序没有崩溃,但我设置了一些断点并进入了几个断点,发现了这个:
它似乎是一个糟糕的内存地址,但我不知道该怎么办。有什么建议吗?
更新#2 :我可能有一个线索。我在每个lazy var
中放置了一个print语句(例如print(“我得到懒惰的var协调器”)),并且每个人都将消息打印到控制台,除了lazy var context
。实例化我的CDHelper类应该启动一系列事件来初始化所有这些,但由于某种原因它会跳过这一个。我重置了模拟器,这没有帮助......
我编写了一些代码,这些代码会使用选项绑定将一些默认应用数据插入到名为“Lift”的Core Data实体中:
if let liftEntity = NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context) {
let lift = Lift(entity: liftEntity, insertIntoManagedObjectContext: CDHelper.shared.context)
lift.uid = defaultLift.uid
lift.liftName = defaultLift.liftName
print("Inserted New Managed Object for '\(lift.liftName)'")
CDHelper.saveSharedContext()
} else {
// skip setup
}
}
问题是liftEntity没有被分配一个值,因此告诉我NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context)
没有返回任何内容。我已经检查了我能想到的一切,甚至从头开始重新创建了数据模型,所以我可以看到Lift实体。
这必然意味着上下文存在问题。提前为代码量道歉,但我认为这是相关的。以下是如何创建的(摘自Tim Roadley的书,使用Swift学习iOS的核心数据):
private let _sharedCDHelper = CDHelper()
class CDHelper : NSObject {
// MARK: - SHARED INSTANCE
class var shared : CDHelper {
return _sharedCDHelper
}
// MARK: - PATHS
lazy var storesDirectory: NSURL? = {
let fm = NSFileManager.defaultManager()
let urls = fm.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
print(urls)
return urls[urls.count-1]
}()
lazy var localStoreURL: NSURL? = {
if let url = self.storesDirectory?.URLByAppendingPathComponent("LocalStore.sqlite") {
print("localStoreURL = \(url)")
return url
}
return nil
}()
lazy var modelURL: NSURL = {
let bundle = NSBundle.mainBundle()
if let url = bundle.URLForResource("oneRepMax", withExtension: "momd") {
return url
}
print("CRITICAL - Managed Object Model file not found")
abort()
}()
// MARK: - CONTEXT
lazy var context: NSManagedObjectContext = {
let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)
moc.persistentStoreCoordinator = self.coordinator
print (moc)
return moc
}()
// MARK: - MODEL
lazy var model: NSManagedObjectModel = {
return NSManagedObjectModel(contentsOfURL:self.modelURL)!
}()
// MARK: - COORDINATOR
lazy var coordinator: NSPersistentStoreCoordinator = {
return NSPersistentStoreCoordinator(managedObjectModel:self.model)
}()
// MARK: - STORE
lazy var localStore: NSPersistentStore? = {
let options:[NSObject:AnyObject] = [NSSQLitePragmasOption:["journal_mode":"DELETE"]]
var _localStore:NSPersistentStore?
do {
_localStore = try self.coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: self.localStoreURL, options: options)
return _localStore
} catch {
return nil
}
}()
// MARK: - SETUP
required override init() {
super.init()
self.setupCoreData()
// Import Default Data
if let _localStoreURL = self.localStoreURL {
CDCreator.shared.checkIfDefaultDataNeedsSetup(_localStoreURL, type:
NSSQLiteStoreType)
} else {print("ERROR getting localStoreURL in \(#function)")}
}
func setupCoreData() {
_ = self.localStore
我已经尝试了一些基本的调试(因为我对此很新)通过检查我设置的某些断点处的各种值,但没有任何有用的结果。我也重置了模拟器,但仍然没有。
任何人都可以看到我可能出错的地方或提供一些如何更好地调试此问题的技巧吗?
更新:在我的桌面上复制了我的.xcdatamodel
文件后,我将其从我的项目中删除,然后将其添加回来,希望这可能会重置某些内容。不幸的是,它仍然无法为liftEntity
分配值。使用DB Browser for SQLite,我已经验证了实体确实存在。