如何使用 swift 3 xcode 8 在核心数据中预加载数据库

Posted

技术标签:

【中文标题】如何使用 swift 3 xcode 8 在核心数据中预加载数据库【英文标题】:How to pre load database in core data using swift 3 xcode 8 【发布时间】:2016-11-23 09:58:10 【问题描述】:

我有一个包含数据的数据库,我想在应用程序中预加载它。在 swift 3 之前它可以工作,我已经按照本教程进行操作:http://www.appcoda.com/core-data-preload-sqlite-database/ 但是如何为 swift 3 加载相同的数据库?介绍了NSPersistentContainer,如何加载项目中的 .sqlite 文件?

【问题讨论】:

找到解决办法了吗? @LokeshChowdary yes.check 我已经添加了我的答案,它工作得很好。 【参考方案1】:

实际上创建数据库的默认路径在 swift 3 中已更改。所以现在代码看起来像:

func preloadDBData() 
    let sqlitePath = Bundle.main.path(forResource: "MyDB", ofType: "sqlite")
    let sqlitePath_shm = Bundle.main.path(forResource: "MyDB", ofType: "sqlite-shm")
    let sqlitePath_wal = Bundle.main.path(forResource: "MyDB", ofType: "sqlite-wal")

    let URL1 = URL(fileURLWithPath: sqlitePath!)
    let URL2 = URL(fileURLWithPath: sqlitePath_shm!)
    let URL3 = URL(fileURLWithPath: sqlitePath_wal!)
    let URL4 = URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/MyDB.sqlite")
    let URL5 = URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/MyDB.sqlite-shm")
    let URL6 = URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/MyDB.sqlite-wal")

    if !FileManager.default.fileExists(atPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/MyDB.sqlite") 
        // Copy 3 files
        do 
            try FileManager.default.copyItem(at: URL1, to: URL4)
            try FileManager.default.copyItem(at: URL2, to: URL5)
            try FileManager.default.copyItem(at: URL3, to: URL6)

            print("=======================")
            print("FILES COPIED")
            print("=======================")

         catch 
            print("=======================")
            print("ERROR IN COPY OPERATION")
            print("=======================")
        
     else 
        print("=======================")
        print("FILES EXIST")
        print("=======================")
    

现在您可以从 AppDelegate 的 didFinishLaunchWithOptions 方法中调用此方法,这将预加载我们已放入应用程序的数据库。

【讨论】:

Pooja:你为 ios 9.0 的支持做了上面的代码吗? @pooja Shah 您是否为 ios 9.0 完成了上述代码?如果是这样,请帮助我。 @LokeshChowdary , Pooja:你在同一个项目中使用过 csv (appcoda.com/core-data-preload-sqlite-database) 吗?我需要从 csv 中获取数据并显示在表格视图中。 @pkc456 您可以使用工具名称直接将 csv 文件转换为 db:sqlite 或 mesa sql,然后在应用程序中使用该数据库。 @PoojaShah :嘿,我的应用程序崩溃了,因为在我的应用程序包中我没有全部 3 个文件,我从哪里提取 3 个文件。实际上我遵循appcoda.com/core-data-preload-sqlite-database 教程并打印文档路径但在那里没有找到任何单个文件..请帮助我,提前谢谢..!

以上是关于如何使用 swift 3 xcode 8 在核心数据中预加载数据库的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 XCODE 8、Swift 3 中使用 UIAutomation

如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?

如何更改xcode 8.3.3(swift3)的语言设置[重复]

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

如何在 XCode 8 Playgrounds 中使用 Swift 2.3?

如何在 iOS Swift 3.1 Xcode 8.3.2 中为 iPad 应用程序安装 iPhone 应用程序