使用核心数据插入/更新记录的最有效方法?

2024-01-19

我正在开发一个定期从服务器下载数据的应用程序。如果数据需要更新,我会使用类似以下内容来更新记录或插入新记录(如果不存在)。

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Trip")
    for csvTrip in csvTrips {
        var trip: NSManagedObject!

        let tripId = Int(csvTrip[0])!
        fetchRequest.predicate = NSPredicate(format: "id = %d", tripId)

        if (context.count(for: fetch) == 0) {
            trip = NSEntityDescription.insertNewObject(forEntityName: "Trip", into: context)
            trip.setValue(tripId, forKey: "id")
        } else {
            tripObject = (context.fetch(fetch) as! [NSManagedObject])[0]
        }

        // Set other properties
    }

检查每个循环中的实体是否已经存在,比不检查而直接插入实体要慢约 100 倍,这对于超过几千个实体来说是一个大问题。我已经尝试先获取所有实体,但我仍然必须循环遍历每个实体并将 id 添加到数组或其他内容中,这并没有快多少。我知道核心数据与 MySQL 不一样,但我很难相信没有类似 INSERT ... ON DUPLICATE KEY UPDATE 的功能,这在 MYSQL 中速度非常快。我错过了什么吗?


如果获取甚至几千个实体并将 id 加载到Set花了特别长的时间。

你可以使用类似的东西:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Trip")
fetchRequest.resultType = .dictionaryResultType
fetchRequest.propertiesToFetch = ["id"]
do {
   if let results = try self.moc.fetch(fetchRequest) as? [[String:Any]] {
       let idSet = Set<Int32>(results.flatMap({ (dict) -> Int32? in
                return dict["id"] as? Int32
        }))
   }
 } catch {
     print("Error reading trips")
 }

现在您可以轻松检查给定的 id 是否是新的,并根据需要插入新的行程:

for csvTrip in csvTrips {
    if let tripId = Int(csvTrip[0]) {
        if !idSet.contains(tripId) {
            trip = NSEntityDescription.insertNewObject(forEntityName: "Trip", into: context)
            trip.setValue(tripId, forKey: "id")
        }
     }
}

在我的测试中,将 320,000 个行程 ID 加载到集合中需要 1.35 秒,创建 10,000 个新行程需要 0.08 秒,同时检查行程 ID 是否包含在集合中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用核心数据插入/更新记录的最有效方法? 的相关文章

  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • 如何使用 AppDelegate 在视图之间共享 iAd 横幅

    我希望在我的应用程序中实现 iAd 到目前为止 我已经成功地使用下面的方法让它们在每个视图中正确显示 关闭 应用程序委托 import UIKit import iAd UIApplicationMain class AppDelegate
  • 如何在 RxSwift 中延迟地从 Collection 中一件一件地发出项目

    我想从anyCollection 创建一个Observable 它会在延迟后一一发出每个元素 另外 在下一步我想对项目 模型 执行一些更新 例如 喂所有狗 一只一只 间隔 5 秒 class Dog var name String var
  • AUGraphInitialize添加kAudioUnitSubType_Reverb2到AUGraph时出现错误代码-10868

    我正在尝试添加 AudioUnit 类型kAudioUnitSubType Reverb2 to an AUGraph我得到了 10868 kAudioUnitErr FormatNotSupported 支持的错误AUGraphIniti
  • 如何将动画应用到 GMSMarker

    我正在通过使用适用于 iOS V1 1 0 的 Google Maps SDK 将 iOS 地图迁移到 google 地图来更改我的应用程序 并且我尝试在添加 删除时对标记进行动画处理 但我在与此相关的文档中没有找到任何建议 请建议我如何在
  • 我何时以及为什么要使用 ARC 将局部变量声明为 __weak?

    Mike Ash 撰写了 ARC 简介 http www mikeash com pyblog friday qa 2011 09 30 automatic reference counting html他在那里介绍了这样的内容 weak
  • iPhone - 如何通过基于度数的位置获取方向

    首先 我在班级中实现了位置管理器功能 并且运行良好 并为我提供了当前位置 从那个位置我得到了如何获得位置度here http www switchonthecode com tutorials getting your location i
  • UITableViewCell 上的自动布局问题

    我在使用自动布局时遇到问题xcode 5项目 我在内部使用带有导航控制器的普通视图控制器 我有一个MKMapView在上半部分和一个UITableView在下半部分 我在用storyboards 并配置了原型UITableViewCell
  • Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误

    鉴于这两个协议及其扩展 protocol FirstDelegate func someFunc protocol SecondDelegate func someFunc extension FirstDelegate func some
  • 如何去除 UIImageView 遮罩后的透明区域?

    在我的一个 iOS 应用程序中 我尝试使用以下命令剪切图像的一部分CGImageMask 我已成功使用以下代码屏蔽图像 UIImage maskImage UIImage referenceImage withMask UIImage ma
  • 如何更改 MGLPolyline 的颜色?

    如何更改 MGLPolyline 的颜色 我曾经看过here https stackoverflow com questions 32024464 customize mglpolyline using mapbox但答案不起作用 我还尝试
  • CLGeocoder reverseGeocodeLocation 返回“kCLErrorDomain 错误 9”

    我正在根据本文开发具有反向地理编码功能的 iOS 应用程序 地理编码教程 http jonathanfield me jons blog clgeocoder example html 但是当我在模拟器上进行这样的测试时 我收到 kCLEr
  • UIButton 和滑动手势

    我有一个UIView有两个UIButton每侧 左侧和右侧 都有 s 和UIImageView在中心 点击任一按钮都会改变UIImageView那行得通 我想要滑动的能力UIView以及它改变UIImageView 现在 您必须在UIIma
  • 动态图标 iOS [重复]

    这个问题在这里已经有答案了 可能的重复 每天更改图标 https stackoverflow com questions 4038305 changing icon per day 如何制作动态图标 例如在日历中 每天该数字都会更改为当前值
  • CoreBluetooth广告检测时间

    这个问题早在10月份就已经讨论过here https stackoverflow com questions 12866551 corebluetooth connection setup time varies quite a bit 1
  • 反应本机套接字 io 没有从客户端发出事件

    尝试将socket io client与react native 现在是ios 一起使用 到目前为止 连接 从客户端接收服务器端事件似乎工作正常 但是我似乎无法从客户端发出任何事件 Client var socket io http loc
  • 图像高斯模糊 - iOS 8

    我有一个移动的背景图像 我想模糊它的底部 我would只用 Photoshop 就能做到 但由于图像会移动 效果不太好 这就是我的意思 看图片底部 基本上就像底座对 iPhone 的影响一样 我使用的是 iOS 8 但不是 Swift 我根
  • iOS7 XIB 问题。顶部和底部的空白

    我有一个正在设置 ImageView 的视图 自动布局已选中 预览中看起来不错 但当应用程序实际在模拟器上运行时 仅在 iPhone 视网膜 4 英寸模拟器中 顶部和底部显示空白 3 5寸的看起来还不错 使用 iOS7 和 XCODE 5
  • 添加到 Xcode App 时,Bazel 框架抛出“无法检查应用程序包”

    我正在使用 Bazel 构建基于 MediaPipe 的人脸识别库 我正在使用apple xc框架 https github com bazelbuild rules apple blob master doc rules apple md
  • UILocalNotification 播放自定义声音

    我在我的应用程序中实现了本地通知 但我只是想知道是否有一种方法可以播放不属于 iPhone 应用程序主包的一部分的声音 基本上在我的应用程序中 我希望用户录制生成本地通知时播放的声音 而不是播放预先录制的或默认的声音 据我所知 这是可以实现

随机推荐

  • 无法使用自定义样式编织为 pdf

    尝试使用自定义 mystyles sty 文件从 RStudio 编织为 pdf 这曾经工作正常 但现在我已经升级到 RStudio 1 044 我收到错误 Example title Test output pdf document in
  • 分析(可能受 I/O 限制)进程以减少延迟

    我想提高大型应用程序中特定方法的性能 目标是改善延迟 特定功能所花费的挂钟时间 而不是 必然 系统负载 要求 由于我预计大部分延迟是由 I O 造成的 因此请考虑等待 阻塞所花费的时间 换句话说 查看挂钟时间而不是 CPU 时间 由于该程序
  • 已解析的依赖项中存在不兼容的版本

    我正在尝试运行我的 python 项目 该项目似乎在我的 Mac 上运行良好 在 pycharm 中最好 不太好 但可以在 VSCode 中运行 但在 VSCode 中的树莓派上运行得很糟糕 每当我运行pipenv shell然后一个pip
  • StepFunction 的 Choice 规则检查数组字段是否为空

    有没有办法在 Step Function 中创建选择规则来确定数组字段是否有元素 当前 StepFunction 文档 https docs aws amazon com step functions latest dg amazon st
  • 在 C 和 C++ 中 main() 应该返回什么?

    定义的正确 最有效 方法是什么main C 和 C 中的函数 int main or void main 为什么 那么论点又如何呢 如果int main then return 1 or return 0 返回值为main指示程序如何退出
  • 使用蓝牙在其他 iOS 设备上拍照

    如果有 iOS 蓝牙经验的人可以向我展示如何使用蓝牙类在其他 iOS 设备上拍照 我将不胜感激 该应用程序允许用户登录 注册 然后拍摄并上传照片 http www raywenderlich com 13511 how to create
  • 使用 PHP 将特殊字符转换为普通字符,例如将 ã、é、ç 转换为 a、e、c [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 PHP 将特殊字符转换为普
  • UNIX 命令 mv 和 rm 如何处理打开的文件?

    如果我正在读取存储在 NTFS 文件系统上的文件 并且尝试在读取该文件时移动 重命名该文件 我将无法这样做 如果我在 UNIX 文件系统 例如 EXT3 上尝试此操作 它会成功 并且执行读取的进程不受影响 我什至可以 rm 文件并且读取过程
  • 有没有办法保护Python eval 的字符串?

    关于使用Python的eval有很多问题不安全的字符串 eg Python eval 在不受信任的字符串上的安全性 https stackoverflow com questions 661084 security of pythons e
  • 比较序言中两个列表的内容

    我正在做一些家庭作业 但我被困在一个点上 我得到了一些这样的事实 word h e l lo word m a n word w o m a n etc 我必须制定一条规则 以便用户输入一个字母列表 我应该将该列表与我拥有的单词进行比较并纠
  • 如何生成重复字符的排列

    我基本上想创建由三个操作符号组成的字符串 例如 or or 这些字符串中的每一个都应该被推入vector
  • 将 Rails 中的日期时间字符串转换为 UTC

    我有一个像这样的字符串 2010 01 01 12 30 00 我需要将当前本地时区转换为 UTC 我尝试了这个 但似乎认为该字符串已经是 UTC 2010 01 01 12 30 00 to datetime in time zone C
  • MVC4 通过 Ajax.BeginForm 传递模型

    我尝试过遵循一些好帖子 https stackoverflow com questions 5410055 using ajax beginform with asp net mvc 3 razor在这里让它工作 但每次我单击 ajax 回
  • 某些页面上有 https 请求,但并非所有页面上都有 https 请求 zend Framework

    我需要将 https 放在某些 URL 上 但不是所有 URL 上 我正在使用 zend URl view helper 来查看所有链接 我有一个用于整个网站的 example com SSL 证书 现在我打开网站https www exa
  • 与 os.scandir() 引发 AttributeError: __exit__

    An AttributeError当我使用 python 文档中的示例代码时引发 here https docs python org 3 library os html os scandir 示例代码如下 with os scandir
  • ViewPager 或 ScrollView 中的 WebView - Android 3.0+ 上奇怪的渲染错误

    我有一个 ViewPager ViewPager的每一页都是一个ScrollView ScrollView 包含一个 WebView 和几个其他视图 在 Android 2 3 及更早版本上一切正常 但在 3 0 上有一个奇怪的渲染问题 在
  • 制作远程 git 存储库的本地副本

    我对版本控制的术语或实践和程序不是很熟悉 这就是我想做的 我想从互联网上的 git 存储库下载一个文件夹 克隆是正确的方法吗 克隆不会保留不必要的元数据文件吗 有没有办法进行 干净 下载 我想设置一个包含此文件夹的本地存储库 我现在可以在其
  • 当ant运行在JDK1.6中时如何将类编译到JDK1.5

    我的开发环境运行在JDK1 6中 我需要编译一些类 以便它们与运行JDK1 5的客户端兼容 我该如何使用 javac ant 目标来做到这一点 命令行 javac target 1 5 源文件 Ant lt javac srcdir src
  • 在 Java 中通过套接字发送图像的有效方法

    我是一个 Java 菜鸟 我已经阅读了一些有关套接字的基础知识 并且我可以使用 ImageIO 通过套接字成功发送图像 但我想减少发送的数据量 最终 我希望以尽可能小的文件大小尽快发送图像 屏幕截图 现在 我已经这样设置了 imageIO
  • 使用核心数据插入/更新记录的最有效方法?

    我正在开发一个定期从服务器下载数据的应用程序 如果数据需要更新 我会使用类似以下内容来更新记录或插入新记录 如果不存在 let fetchRequest NSFetchRequest