SQLite 数据在模拟器应用程序启动之间丢失



这感觉很奇怪,我不知何故无法通过搜索找到答案。这是Xcode iOS Simulator上的问题。

我正在编写数据持久性代码。在实例化数据存储时,我几乎从 Apple (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/InitializingtheCoreDataStack.html#//apple_ref/doc/uid/TP40001075-CH4-SW1) 复制了以下代码片段。

现在,问题似乎 - storeURL(在调试中)是一个包含长数字字符串的 URL,重新启动模拟器时,该长数字字符串已更改。因此,无法再访问 sqlite 文件。我确实相信我正确保存了数据,因为我通过代码进行了调试(并且调用了上下文保存 api,没有错误),我在保存后检索了数据(没有重新启动),并且我使用命令行 sqlite 工具查看数据针对 sqlite 文件。

import UIKit
import CoreData
class DataController: NSObject {
    var managedObjectContext: NSManagedObjectContext
    init() {
        // This resource is the same name as your xcdatamodeld contained in your project.
        guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else {
            fatalError("Error loading model from bundle")
        }
        // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
        guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else {
            fatalError("Error initializing mom from: (modelURL)")
        }
        let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
        self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
        self.managedObjectContext.persistentStoreCoordinator = psc
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
            let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
            let docURL = urls[urls.endIndex-1]
            /* The directory the application uses to store the Core Data store file.
            This code uses a file named "DataModel.sqlite" in the application's documents directory.
            */
            let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")
            do {
                try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
            } catch {
                fatalError("Error migrating store: (error)")
            }
        }
    }
}

这基本上是马特在评论区说的。此问题与放置 .sqlite 文件的位置有关。

最新更新