使用 iOS 应用发送核心数据

Posted

技术标签:

【中文标题】使用 iOS 应用发送核心数据【英文标题】:Shipping core data with iOS app 【发布时间】:2016-06-10 17:59:39 【问题描述】:

我正在开发一个字典应用程序,其中包含大约 10,000 个单词。我正在使用核心数据来存储所有数据,并且我使用的语言是 swift。

我想要的只是将这些数据与应用一起发送,这样当应用从应用商店下载时,它就会包含所有数据。

我已经对此进行了搜索,发现可以通过将 SQLite 文件包含到项目中来完成。但是真的不知道该怎么做,El Capitan的模拟器目录在哪里。

我只是 ios 的初学者,所以请有人用非常简单的步骤向我解释一下。

【问题讨论】:

嗨。很高兴有帮助。如果答案有助于其正常做法,请在相关答案上勾选接受标记。一切顺利! 【参考方案1】:

这可能是一个很长的答案。最好将其解释为教程。以下链接将向您展示该怎么做。

http://www.appcoda.com/core-data-preload-sqlite-database/

我发现文章/教程的开头和结尾对您尝试做的事情很有用。

我最近将数据预加载到一个测验的应用程序中,使用单独的 Xcode 模拟器来创建所需的 3 个 SQLite 文件。这篇文章将向您展示如何找到它们如何将它们“捆绑”到您想要“预加载”的 Xcode 项目中,并将告诉您代码在您的“AppDelegate.swift”文件中添加。

3 件事可以帮助您在完成项目时避免问题...

    确保您在模拟器(独立项目)中创建的数据的实体和属性名称(在您的数据模型(核心数据)中)与项目中的相同你想“预加载”。 [否则预加载不会工作]

    添加到 'AppDelegate.swift' 中的代码旨在指导您的应用程序将预加载数据转到何处(请参阅随附的教程),但是,我发现我需要调整代码以使其工作...(如下所述)

    没有从 'AppDelegate.swift' 文件中删除任何内容,只是添加了 3 个 SQLite 文件的名称...例如

在 Core Data 堆栈的“AppDelegate.swift”中...您会发现...

lazy var managedObjectModel: NSManagedObjectModel = 
        // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
        let modelURL = NSBundle.mainBundle().URLForResource("EoMQ", withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
    ()

别管这个,但直接在下面你需要有以下代码......

// ---------------------------------------------------
        // Create the coordinator and store
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("Q100cdCoreData.sqlite") // originally = "SingleViewCoreData.sqlite" - then changed to new name... from imported sqlite files
        // ---------------------------------------------------
        // ** Load the Already made DB from Simulator **
        if !NSFileManager.defaultManager().fileExistsAtPath(url.path!) 

            let sourceSqliteURLs = [NSBundle.mainBundle().URLForResource("Q100cdCoreData", withExtension: "sqlite")!, NSBundle.mainBundle().URLForResource("Q100cdCoreData", withExtension: "sqlite-wal")!, NSBundle.mainBundle().URLForResource("Q100cdCoreData", withExtension: "sqlite-shm")!]

            let destSqliteURLs = [self.applicationDocumentsDirectory.URLByAppendingPathComponent("Q100cdCoreData.sqlite"), self.applicationDocumentsDirectory.URLByAppendingPathComponent("Q100cdCoreData.sqlite-wal"), self.applicationDocumentsDirectory.URLByAppendingPathComponent("Q100cdCoreData.sqlite-shm")]

            for index in 0 ..< sourceSqliteURLs.count 
                do 
                    try NSFileManager.defaultManager().copyItemAtURL(sourceSqliteURLs[index], toURL: destSqliteURLs[index])
                 catch 
                    print(error)
                
            
           

我在模拟器中创建的 3 个文件名为“Q100cdCoreData”,但具有三种不同的扩展名... (a) .sqlite (b) .wal (c) .shm

但是你需要通过教程并理解这个过程。

【讨论】:

正是我想要的。非常感谢。【参考方案2】:
    将 sqlite 文件添加到项目中。

    你会打电话的

     [[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&error]
    

之前:

    [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                       configuration:nil
                                                                 URL:storeURL
                                                             options:nil
                                                               error:&error]

preloadURL 将是应用程序包中文件的 URL。 storeURL 是核心数据的 sqlite 文件的路径(通常在应用程序目录中)。

因此,如果文件不存在,则会将文件从捆绑包复制到应用目录,否则会失败。

【讨论】:

我提到我是初学者。那么请解释一下我应该在我的应用中捆绑什么以及从哪里捆绑? @codename_mak 我已经编辑了答案以解释这些步骤。 我不知道sqlite文件在哪里。也请迅速提供代码。 devim1 的回答提供了很好的细节以及您可以遵循的教程。

以上是关于使用 iOS 应用发送核心数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Asp.net 核心向 Flutter 应用发送推送通知

向核心蓝牙框架 Xcode 发送数据

Tableview 中的 Xcode 核心数据

如何使用 Tranquility 核心 API 向 druid 发送数据?

如何使用静态库(iOS)在应用程序中隐藏核心数据模型?

核心数据:写时复制实体?