使用预填充的核心数据部署应用程序

2024-01-21

我正在尝试将我的应用程序与Core Data已经有人居住。我找到了一些链接,其中解释了如何执行此操作,但要么不起作用,要么答案非常旧。我跟着发帖但不起作用。解决方案可能是导入.sqlite文件到应用程序文件夹,然后将它们复制到设备的文件系统,但我不知道该怎么做。有没有什么方法可以用现有实体和记录预先填充我的核心数据?


这是我找到的解决方案:

Step 1
填充您的Core Data在另一个应用程序中并使用以下代码获取文件路径:

let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
print(documentsDirectory)

Step2
拖动你的 3 个文件.sqlite扩展到您的 xCode 项目中。 (一定要选择Add to targets选项)。

Step3
创建函数来检查应用程序的首次运行。

func isFirstLaunch() -> Bool {
    let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag"
    let isFirstLaunch = !UserDefaults.standard.bool(forKey: hasBeenLaunchedBeforeFlag)
    if (isFirstLaunch) {
        UserDefaults.standard.set(true, forKey: hasBeenLaunchedBeforeFlag)
        UserDefaults.standard.synchronize()
    }
    return isFirstLaunch
}

Step4
将此复制到AppDelegate:

func getDocumentsDirectory()-> URL {
    let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "ProjectName")

    let appName: String = "ProjectName"
    var persistentStoreDescriptions: NSPersistentStoreDescription

    let storeUrl = self.getDocumentsDirectory().appendingPathComponent("FileName.sqlite")

    if UserDefaults.isFirstLaunch() {
        let seededDataUrl = Bundle.main.url(forResource: "FileName", withExtension: "sqlite")
        try! FileManager.default.copyItem(at: seededDataUrl!, to: storeUrl)
    }

    let description = NSPersistentStoreDescription()
    description.shouldInferMappingModelAutomatically = true
    description.shouldMigrateStoreAutomatically = true
    description.url = storeUrl

    container.persistentStoreDescriptions = [description]

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

Step 5
如果您想删除新的Core Data文件,使用此功能:

func deleteFiles() {
    let fileManager = FileManager.default
    let documentsUrl =  FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! as NSURL
    let documentsPath = documentsUrl.path

    do {
        if let documentPath = documentsPath {
            let fileNames = try fileManager.contentsOfDirectory(atPath: "\(documentPath)")
            print("all files in cache: \(fileNames)")
            for fileName in fileNames {
                if (fileName.contains("YourFileName")) {
                    let filePathName = "\(documentPath)/\(fileName)"
                    try fileManager.removeItem(atPath: filePathName)
                }
            }
            let files = try fileManager.contentsOfDirectory(atPath: "\(documentPath)")
            print("all files in cache after deleting images: \(files)")
        }
    } catch {
        print("Could not clear temp folder: \(error)")
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用预填充的核心数据部署应用程序 的相关文章

随机推荐

  • Browser.ReadyState 上的致命执行错误[重复]

    这个问题在这里已经有答案了 可能的重复 NET 致命执行引擎错误 故障排除 https stackoverflow com questions 2823440 troubleshooting net fatal execution engi
  • VB.NET 的表达式主体成员?

    VB NET 支持表达式主体成员吗 到目前为止 它似乎拥有 C 中的所有内容 例如 null 条件 nameof 内插字符串 只能通过 ctor 访问的无实体自动属性等 在 C 中 语法为 string FullName gt FirstN
  • 单击鼠标获取鼠标坐标

    我正在使用下面的代码 但它并不像我想要的那样工作 而且我不知道如何实际制作它 我想要它做的是获取鼠标坐标onClick 但这发生在用户确认消息框之后 消息框 gt 用户单击确定 gt 用户单击屏幕上的任意位置 gt 获取坐标 我应该在 确定
  • Axios 请求失败,状态代码 429,但它正在与 Postman 一起使用

    我正在尝试使用访问此 APIaxios但我收到错误 状态 429 请求太多 我只发送一个请求 但仍然出现错误 但是当我尝试使用邮递员访问此网址时 它正在工作 axios post https www expedia com Hotel Se
  • Objective-C - 将图像转换为 icns

    我正在尝试为 Mac OS X 创建一个应用程序 它将图像类型转换为 icns 文件 我想知道如何开始这样做 任何建议都会很好 Thanks Kevin 使用 CGImageSource API 例如 CGImageSourceCreate
  • 无法使用 ISTIO 网关和虚拟服务连接到 HTTPS 服务

    由于我和我的所有团队成员都是 Istio 的新手 如果我们能在这里获得一些帮助 我们将不胜感激 Problem我已按照以下文档使用应用程序证书和密钥在 k8s 中创建证书并创建机密 https istio io docs tasks tra
  • 缩放单例

    在花了几个小时思考基于服务器的应用程序的一些架构问题之后 我觉得我将不得不使用单例来实现我的目标 纯粹出于以下原因 证明我的气味是合理的 我不需要将昂贵的对象传递到调用堆栈深处 我可以在任何上下文中对单例管理对象执行功能 很多代码已经存在
  • Swagger 标头定义

    我似乎找不到是否可以声明标头对象以便在响应标头中重用它 有为响应模式定义对象的示例 但它不会转置为响应标头 我只设法制作了一个可重用的响应对象 如下所示 responses DownloadOk description Dowload Ok
  • OS X clang -pthread

    在 OS X 中使用 pthread 库和 clang 的编译器 链接器要求是什么 对于 GCC 我知道使用 pthread 设置适当的编译器 链接器选项 但我不确定 OS X 与 clang 的情况 air jose clang c te
  • Symfony2 和 Doctrine2:没有为实体“X”指定标识符/主键。每个实体必须有一个标识符/主键

    我正在使用 Symfony2 创建一些虚拟项目 我遵循 Symfony2 Book 文档来使用 Doctrine 命令行创建实体 http symfony com doc current book doctrine html add map
  • 与 apache Web 服务器和 tomcat 服务器的粘性会话

    我使用 apache Web 服务器作为 apache 后面的两个 tomcat 实例的负载平衡器 当第一个请求发送到节点 A 而来自同一客户端的第二个请求发送到节点 B 时 我无法访问节点 A 内的会话变量 这是显而易见的 我在互联网上冲
  • 如何创建适合移动和桌面浏览器的平面图?

    想要创建一个办公室的动态平面图 以显示占用情况并链接到会议等 我手头有一些 AutoCAD 文件 并且一直在研究在浏览器上制作此文件的方法 在我看来 SVG 将是一个很好的竞争者 它支持大多数移动和桌面浏览器 请不要使用旧版本的 IE 但我
  • Rust 似乎在内存中为布尔数组分配与 8 位整数数组相同的空间

    Running fn main println std mem size of lt u8 1024 gt println std mem size of lt bool 1024 gt 1024 1024 这不是我所期望的 所以我编译并在
  • 找不到 Alamofire 框架

    我正在尝试将 alamofire 安装到我的项目中 以便我可以将图像上传到我的服务器 但是我似乎找不到alamofire framework文件 我已经下载了两次 git 完成了安装说明https github com Alamofire
  • SQL NOT IN 子句

    我有一个查询未按预期工作 Q1 SELECT id name FROM vw x WHERE id NOT IN select pid from table x GROUP BY id name Having max c date gt G
  • SQL Server:存储过程的 EXECUTE AS 子句未授予 sysadmin 权限

    我开发了一个存储过程 以便从备份文件恢复数据库并向其中添加应用程序用户 该存储过程属于master 数据库 问题是我的 IT 部门不允许我使用管理员用户 只能使用 sysadmin 用户的 EXECUTE AS 语句 我可以恢复数据库 但找
  • 为什么要设置线程的Terminal属性?

    我有多线程应用程序 procedure TGridUpdater Execute begin inherited CodeSite Send Thread executed sp ConnectionFactory GetConnectio
  • 这是使用和测试利用工厂模式的类的正确方法吗?

    我对工厂模式没有太多经验 我遇到过一种情况 我认为这是必要的 但我不确定我是否正确实现了该模式 并且我担心它的影响对我的单元测试的可读性有影响 我创建了一个代码片段 它 根据记忆 近似于我正在工作的场景的本质 如果有人能看一下它并看看我所做
  • 如何隐藏/加密谷歌和其他浏览器中网络选项卡的ajax请求? [复制]

    这个问题在这里已经有答案了 我正在 jwplayer 上工作 我只想隐藏 加密 jwplayer 发送的用于播放视频的 ajax 请求 原因是 当 jwplayer 发送请求时 它包含视频 ID 我不想透露它 因为它是从 google 驱动
  • 使用预填充的核心数据部署应用程序

    我正在尝试将我的应用程序与Core Data已经有人居住 我找到了一些链接 其中解释了如何执行此操作 但要么不起作用 要么答案非常旧 我跟着发帖但不起作用 解决方案可能是导入 sqlite文件到应用程序文件夹 然后将它们复制到设备的文件系统