使用iOS应用程序发送核心数据

时间:2016-06-10 17:59:39

标签: ios iphone core-data swift2 osx-elcapitan

我正在开发一个包含大约10,000个单词的词典应用程序。我正在使用核心数据来存储所有数据,而我正在使用的语言很快。

我想要的只是通过应用程序发送此数据,以便从应用程序商店下载应用程序时,它包含所有数据。

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

我只是iOS的初学者,所以请用非常简单的步骤向我解释。

2 个答案:

答案 0 :(得分:2)

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

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

我发现文章/教程的开头和结尾对你要做的事情有用。

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

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

  1. 确保您在模拟器(单独项目)中创建的数据的实体和属性名称(在您的数据模型(核心数据)中)与项目中的数据相同你想'PreLoad'。 [否则预加载WONT工作]

  2. 在“ AppDelegate.swift ”中添加的代码旨在指导您的应用程序指向预装数据的位置(请参阅随附的教程),但是,我发现了需要调整代码以使其工作......(如下所述)

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

  4. 核心数据堆栈中的'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

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

答案 1 :(得分:0)

  1. 将sqlite文件添加到项目中。
  2. 您将致电

     [[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&error]
    
  3. 之前:

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

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

    因此,如果文件不存在则将文件从bundle复制到app目录,否则将失败。