【问题标题】:Loading Core Data database created by iOS app into different Xcode application将 iOS 应用程序创建的 Core Data 数据库加载到不同的 Xcode 应用程序中
【发布时间】:2020-06-27 17:00:27
【问题描述】:

我之前创建了一个将数据保存到数据库的 iOS 应用程序。我已经从应用程序中复制了数据,现在有三个文件:

MyData.sqlite、MyData.sqlite-shm 和 MyData.sqlite-wal

我正在尝试在 Xcode 中创建一个命令行实用程序,它将访问这些数据库中的数据。我已将 CoreData 添加到命令行实用程序项目中,并且能够创建一个新数据库。我想要的是加载我从应用程序导出的数据库。

我从某人那里找到了一个先前的问题: Migrate Core Data database from one app to another

但是,他们的回答对我不起作用。这一行:

let storeUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!.appendingPathComponent(databaseName + ".sqlite")

给出这个错误:

expression produced error: error: /var/folders/cc/r_54b90515v_m6t41vg9lg000000gp/T/expr14-6084fa..swift:1:65: error: use of undeclared type 'Foundation'
Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<Foundation.URL>(bitPattern: 0x1004fc2f0)!.pointee)

我觉得我一定错过了这个问题的简单答案。有没有一种简单的方法可以将 Core Data 数据库信息从一个应用程序移植到另一个应用程序?

编辑:感谢下面的 Lou Franco,我取得了一些进展。我现在有:

var persistentContainer: NSPersistentContainer = {

    let container = NSPersistentContainer(name: "MyData")
    let storeUrl = URL(fileURLWithPath: "/Path/To/Data/MyData.sqlite")
    container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeUrl)]
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {

            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

但是我现在得到了"Persistent store migration failed, missing mapping model."总结的一大堆输出

我最初希望通过使用当前核心数据设置容器,我可以以某种方式让程序知道它正在加载什么(数据模型是相同的),但无论如何它似乎都失败了。我在错误消息中注意到:

NSInferMappingModelAutomaticallyOption = 1;
NSMigratePersistentStoresAutomaticallyOption = 1;

有没有办法让程序知道它正在加载的数据符合我已经设置的核心数据模型?它只需要从文件中加载数据。

【问题讨论】:

    标签: ios swift xcode core-data core-data-migration


    【解决方案1】:

    这一行:

    let storeUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!.appendingPathComponent(databaseName + ".sqlite")
    

    不适用于命令行实用程序。它适用于应用程序。

    您将不得不以其他方式获取路径(命令行参数、硬代码、相对于实用程序等)

    例如:

     URL(fileURLWithPath: FileManager.default.currentDirectoryPath).appendingPathComponent("YOURFILE"))
    

    【讨论】:

    • 谢谢,如果我有这三个相关文件以及 XCode 项目中的 main.swift 文件,有没有一种简单的方法可以加载它们?如果我只是输入文件名,它会抱怨它们应该是路径时是字符串。
    • 谢谢。但是我从这一行得到了同样的错误:expression produced error: error: /var/folders/cc/r_54b90515v_m6t41vg9lg000000gp/T/expr34-35f709..swift:1:65: error: use of undeclared type 'Foundation' Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer&lt;Foundation.URL&gt;(bitPattern: 0x1004fc2f0)!.pointee)
    • 您需要提供更多信息。我建议通过注释掉代码来缩小范围,直到您确切知道是什么原因造成的。
    • 你好娄,我已经取得了一些进展并编辑了上面的帖子。
    • 从您的 IPA 中获取 .momd 文件并查看此处的代码:developer.apple.com/library/archive/documentation/Cocoa/… 在“NSPersistentContainer”下。将 IPA 重命名为具有 .zip 扩展名,然后将其解压缩。在那里你会找到 .momd 文件
    【解决方案2】:

    感谢 Lou Franco 的一些建议,我找到了可行的解决方案。我通过将原始应用程序归档并探索 .xcarchive 中导出的 .app 文件从原始应用程序中获取了 .momd 文件。这是一个最小的示例,它使用“/Path/To/Data/MyData.momd”中的数据模型从“/Path/To/Data/MyData.sqlite”中的现有 sqlite 数据库加载数据。它只是抓取所有唯一的会话 ID:

    import Foundation
    import CoreData
    
    let storePath = "/Path/To/Data/MyData.sqlite"
    let storeURL = URL(fileURLWithPath: storePath)
    
    let modelPath =  "/Path/To/Data/MyData.momd"
    let modelUrl = URL(fileURLWithPath: modelPath)
    let mom = NSManagedObjectModel(contentsOf: modelUrl)!
    
    let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
    
    let managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = psc
    
    try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil)
    
    let request: NSFetchRequest<Session> = Session.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "uniqueSessionID", ascending: true)]
    let context = managedObjectContext
    do {
        let dbReturn = try context.fetch(request)
        print(dbReturn)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多