如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目?

2024-04-28

为了有效地提出我的问题,让我们首先考虑一下我面临的具体场景:

常规设置

  • 一个主机 iOS 8 应用程序。
  • 与主机应用程序捆绑在一起的一个或多个 iOS 8 扩展(WatchKit、Share 等)。
  • 主机应用程序和所有扩展在共享应用程序组容器中共享相同的 Core Data SQLite 存储。
  • 每个应用程序/扩展都有自己的 NSPersistentStoreCoordinator 和 NSManagedObjectContext。
  • 每个持久性存储协调器都使用一个持久性存储,该持久性存储与所有其他持久性存储共享组容器中相同的 SQLite 资源。
  • 该应用程序和所有扩展使用通用代码库来同步来自 Internet 上的远程 API 资源的内容。

导致问题的事件顺序

  1. 用户启动主机应用程序。它开始从远程 API 资源获取数据。核心数据模型对象是根据 API 响应创建的,并“插入”到主机应用程序的托管对象上下文中。每个 API 实体都有一个唯一 ID,用于在远程 API 后端中标识它。我所说的“upsert”是指,对于每个 API 实体,如果无法找到给定 uniqueID 的现有条目,主机应用程序只会在核心数据中创建一个新条目。

  2. 同时,用户还启动主机应用程序的扩展之一。它也从同一个远程 API 执行某种类型的获取。在解析 API 响应时,它还会尝试执行“upsert”。

  3. 问题:如果主机应用程序和扩展程序尝试同时更新插入同一 API 实体的核心数据条目,会发生什么?要了解这是如何发生的,让我们看一下更新插入的事件顺序:

核心数据更新插入顺序:

  1. API 解析代码解析给定 API 实体的 uniqueID。
  2. 解析器对与谓词匹配的任何条目执行核心数据获取,其中uniqueID等于解析的uniqueID。
  3. 如果未找到现有条目,则解析器会为此 API 实体插入一个新的 Core Data 条目,并设置其uniqueID解析的 uniqueID 的属性。
  4. 解析器保存托管对象上下文,将新条目数据推送到 SQLite 后备存储。

问题详情

我们假设主机应用程序和扩展程序同时独立地解析同一 API 实体的 API 响应。如果主机应用程序和扩展程序在其中任何一个完成步骤 4 之前都到达步骤 3,那么它们都将尝试为同一 uniqueID 插入新的核心数据条目。当他们到达第 4 步并致电save:在各自的托管对象上下文中,Core Data 将很乐意创建重复的条目。

据我所知,核心数据没有任何方法将属性标记为唯一。我需要一个相当于SQLite INSERT OR IGNORE + UPDATE combo. https://stackoverflow.com/a/15277374/1078579。否则我需要一种方法来“锁定”持久存储的 SQLite 后备存储,这听起来像是一个麻烦的根源。

对于 iOS 8 扩展引入的这个相当新颖的问题,是否有已知的方法?


对于 iOS 8 扩展引入的这个相当新颖的问题,是否有已知的方法?

是的,这与将 iCloud 与 Core Data 结合使用时采用的方法相同:让重复发生,但然后去清理它们。这两种情况都有创建重复条目的风险,并且没有完全可靠的方法来防止它们。既然你有一个uniqueID关键,就这一点而言,你的状态很好。

正如戴夫·德隆所说,从一开始就避免这个问题会容易得多。如果这是不可能的,您可以通过一些额外的工作来处理它。

查找重复项将类似于:

NSError *error = nil;
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:self.persistentStoreCoordinator];

NSFetchRequest *fr = [[NSFetchRequest alloc] initWithEntityName:@"MyEntityName"];
[fr setIncludesPendingChanges:NO];

NSExpression *countExpr = [NSExpression expressionWithFormat:@"count:(uniqueID)"];
NSExpressionDescription *countExprDesc = [[NSExpressionDescription alloc] init];
[countExprDesc setName:@"count"];
[countExprDesc setExpression:countExpr];
[countExprDesc setExpressionResultType:NSInteger64AttributeType];

NSAttributeDescription *uniqueIDAttr = [[[[[_psc managedObjectModel] entitiesByName] objectForKey:@"MyEntityName"] propertiesByName] objectForKey:@"uniqueID"];
[fr setPropertiesToFetch:[NSArray arrayWithObjects:uniqueIDAttr, countExprDesc, nil]];
[fr setPropertiesToGroupBy:[NSArray arrayWithObject:uniqueIDAttr]];

[fr setResultType:NSDictionaryResultType];

NSArray *countDictionaries = [moc executeFetchRequest:fr error:&error];

这在 Core Data 中几乎相当于 SQL 中的类似内容:

SELECT uniqueID, COUNT(uniqueID) FROM MyEntityName GROUP BY uniqueID;

你得到一个字典数组,每个字典包含一个uniqueID以及该值的使用次数。浏览字典并适当处理重复项。

我在中更详细地描述了这一点一篇博文 http://www.atomicbird.com/blog/icloud-complications-part-2。 Apple 还有一个示例项目演示了该过程,称为 SharedCoreData,但我相信它仅作为WWDC 2012 示例代码包 https://developer.apple.com/devcenter/download.action?path=/wwdc_2012/wwdc_2012_sample_code/wwdc_2012_session_code.dmg。该会议第 227 场会议也对此进行了描述。

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

如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目? 的相关文章

  • dequeueReusableCellWithIdentifier: 如何工作?

    我想要一些精确的信息dequeueReusableCellWithIdentifier kCellIdentifier 如果我理解得很好 下面的 NSLOG 应该只打印一次 但事实并非如此 那么 dequeueReusableCell 的意
  • 允许在 Safari 上聊天应用程序使用 audio.play()

    由于苹果禁用了自动播放音频的功能HTMLMedia Element play https developer mozilla org en US docs Web API HTMLMediaElement play在没有用户交互的 java
  • 可以使用两个独立的 SQLite 数据库吗?

    我有一个 sqlite 数据库 其中存储用户定义的信息和用户只读的信息 我觉得将来可能需要修改只读信息 并且我不想进行整个数据迁移 有没有一种方法可以使用单独的 sqlite 数据库来存储只读信息 该数据库可以轻松替换 如果是这样 您能否就
  • 尝试了解CMTime

    我见过一些examples https stackoverflow com questions 5808557 avassetwriterinputpixelbufferadaptor and cmtime of https stackov
  • 使用 SQLite 测试 NHibernate“没有这样的表” - 生成模式

    我正在尝试使用内存中的 SQLite 数据库来测试 NHibernate 提供的数据层 我读过很多关于如何进行此设置的博客和文章 但我现在很困惑为什么它不起作用 问题 当我运行单元测试时 我收到错误 没有这样的表 学生 我读过的文章表明这
  • 为什么我的 Cordova/PhoneGap iOS 应用程序在设备旋转时不旋转?

    我正在尝试做一个仅横向应用程序 https stackoverflow com questions 10996676 phonegap page has wrong rotation shows as portrait in landsca
  • XCODE:如何从设备获取/验证准确的时间戳

    在没有互联网连接的情况下是否可以获得 NTP 或准确的时间戳 我不能接受 不信任带有 NSDate date 的设备时间戳 因为它可以由用户修改 并且我的应用程序将通过修改系统日期和时间而被黑客攻击 除此之外 是否有任何方法可以检查系统日期
  • 为什么这会破坏 UILabel adjustmentFontSizeToFitWidth?

    iOS 7 Xcode 5 使用 UILabel 此代码可以工作 自动调整文本大小以适应 self testLabel numberOfLines 0 self testLabel lineBreakMode NSLineBreakByWo
  • 使用 QuartzCore 为 UITextView 创建阴影 [重复]

    这个问题在这里已经有答案了 我使用创建了一个阴影QuartzCore for my UITextView使用以下代码 myTextView layer masksToBounds NO myTextView layer shadowColo
  • Swift:如何审查/过滤输入的脏话等文本?

    我只是想看看是否有一种既定的方法可以做到这一点 或者如何去做 我有一个文本字段 它本质上充当我的 iOs 应用程序中的表单 用户可以在其中发布内容 我不能让用户发布脏话 不恰当的废话 所以我想过滤掉他们输入的字符串包含这些单词之一的内容并显
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • 我应该保留远程数据库的本地副本吗?

    我正在开发一个应用程序 基本上允许人们创建 加入和管理其他人的群组 群组内的人也可以互相发送消息 我一直在想哪条路会更好 保留包含所有信息的远程数据库 包括发送给用户和从用户发送的消息 并让应用程序在每次需要信息时查询服务器 甚至是它以前见
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 使用 NSMutableAttributedString 更改 WKInterfaceLabel 的文本颜色

    我正在尝试使用 setAttributedText 属性更改 WKInterfaceLabel 中的文本颜色 这是代码 MyRowController row self interfaceTable rowControllerAtIndex
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • 如何找到查询结果的大小

    我在 Rails 中有以下查询 records Record select y id source where source gt source y id gt y id group y id source having count 1 如
  • 我可以对图像进行动画处理吗 iOS8 LaunchScreen.xib

    问题 有没有方法可以为针对 iOS 8 1 部署的 Xcode 6 项目的 LaunchScreen xib 文件中的任何内容设置动画 Context 我正在寻找制作简单的动画来传达活动或在用户等待时分散他们的注意力 例子 加载栏 活动指示
  • 滚动视图下的iOS swift 4 imageview:双击缩小

    我已经应用了图像视图来通过捏合来放大 缩小 那很容易 当在图像视图上应用双击时 无法检测到选择方法 我使用 Xcode 9 和 swift 4 您能告诉我滚动视图是否应该应用双击手势吗 var previewImage UIImage ni
  • 具有多个 sqlite 文件的核心数据

    如何将 Core Data 与多个 SQLite 文件一起使用 每个文件都包含相同的结构 但数据是从不同的位置检索的 我希望能够在运行时根据应用程序设置在这些 sqlite 文件之间切换 当然 只需指向持久存储协调器 NSPersisten

随机推荐

  • Java 中的匿名类是如何编译的?

    我听说 Java 字节码实际上不支持任何类型的未命名类 javac 如何将未命名的类转换为命名的类 它综合了形式的名称EnclosingClass n 其中 n 是匿名类的计数器EnclosingClass 因为使用 不鼓励使用标识符 这些
  • 让 Akka.NET 连接到远程地址

    我发现的所有演示如何开始在 Akka NET 中进行远程处理都演示了最简单的用例 其中两个参与者使用 localhost 在同一台计算机上运行 我试图让 Akka NET actor 连接到远程计算机 但遇到了一些困难 代码非常简单 客户端
  • AngularJS从base64生成二进制数据图像并作为图像文件发送到服务器

    我正在使用这个工具在我的 AngularJS 应用程序中裁剪图像 https github com fengyuanchen cropper https github com fengyuanchen cropper 然后我尝试将数据存储到
  • 硒找不到元素

    我在访问元素时遇到问题 fieldset legend Legend1 legend table width 100 quot cellspacing 3 tbody tr tr tr tr tbody table fieldset leg
  • T-sql:获取列的总和

    我有一张如下所示的表 W1 W2 w3 Gold 10 2 3 Silver 3 1 1 但我需要一个结果 W1 W2 w3 Gold 10 12 15 Silver 3 4 5 有什么方法可以得到这个结果吗 Mysql查询 SELECT
  • 如何让 CopyFileEx 报告回来以便我可以取消文件复制操作?

    我正在尝试使用FileUtilities CopyFile包装纸CopyFileEx from here http msdn microsoft com en us magazine cc163851 aspx 但是CopyFileCall
  • 添加新列后如何使用 activeandroid 更新表

    感谢您的阅读和帮助 我正在使用 ActiveAndroid 3 0 Android 2 2 在我的应用程序中 我有一个名为 用户 的模型 最初 我只使用 id 名称 密码 列 属性创建模型 我在模拟器上运行该应用程序 并且它有效 Table
  • 各种 Python 实现的优缺点是什么?

    我对 Python 比较陌生 并且一直使用标准的 cpython v2 5 实现 不过 我一直想知道其他实现 特别是 Jython 和 IronPython 是什么让他们变得更好 是什么让他们变得更糟 还有哪些其他实现 我想我正在寻找的是每
  • 如何在执行 apache HttpPost 时将 UrlEncodedFormEntity 中的空格编码为 %20?

    我正在访问的网络服务需要 URLEncodedFormEntity 形式的参数 我无法根据 Web 服务的要求将空间更改为 20 而是将空间转换为 我的代码是 HttpClient client new DefaultHttpClient
  • 如何调用在 useEffect 中返回值的自定义钩子?

    我有一个自定义钩子 它通过它获取的参数返回一个对象 我需要使用任何更新的参数重新创建它 所以我需要在内部执行此操作useEffect但我无法调用 useEffect 中的钩子 知道如何实施吗 自定义钩子 useBuilder tsx exp
  • 有没有人有一段 PHP 代码来抓取字符串中的第一个“句子”?

    如果我有这样的描述 我们更喜欢可以回答的问题 而不仅仅是讨论 提供详细信息 写得清晰简单 我想要的只是 我们更喜欢可以回答的问题 而不仅仅是讨论 我想我会搜索一个正则表达式 比如 确定strpos 然后从主字符串中执行一个substr 但我
  • Ada 的命令行参数

    我正在编写一个 Ada 程序 该程序应该对字母字符进行大小写转换 该程序使用 1 2 或 3 个命令行参数 我几乎已经把事情写下来了 但我不知道如何进行论证 命令行参数是 单个字符指定是否要进行大写转换或小写转换 应用于输入 U 或 u 表
  • 如何用 numpy 在 Cython 中表示 inf 或 -inf ?

    我正在用 cython 逐个元素构建一个数组 我想存储常量np inf or 1 np inf 在某些条目中 然而 这将需要返回 Python 进行查找的开销inf 有没有libc math相当于这个常数 或者其他一些可以轻松使用的值 相当
  • C 语言的计算单元转换器

    我正在学习 C 并且编写了一个简单的程序 只是晒黑 输入时 您传递两个参数 行和列 输出时您会获得该单元格的 Calc 或 Excel 代码 例如 Input 3 1 Output A3 Input 1 27 Output AA1 代码 i
  • UIButton 数组或 UIButton 方法(名为:“\(string)”)

    是否可以制作一个数组UIButtons let buttonArray UIButton UIButton Button1 UIButton Button2 UIButton Button3 稍后参考为 buttonArray 0 setI
  • 我可以删除 TabControl 上选项卡上的虚线焦点矩形吗?

    我有一个选项卡控件 需要删除所选选项卡周围的虚线焦点矩形 我已将 TabControl 的 TabStop 属性设置为 false 但是 如果我单击一个选项卡并按Tab键 选项卡名称周围出现虚线矩形 我尝试过创建自己的TabControl并
  • 运行用户数据脚本 AWS EC2 时出现问题

    是否可以通过 AWSCLI 用户数据 运行 python 脚本 我尝试过 但它没有运行 我的日志中有以下内容 boot log 2015 08 07 10 08 30 660 init py WARNING Unhandled non mu
  • 在 silverlight 中播放视频?

    如何使用 silverlight 播放视频 Visual Studio 是否内置了视频播放器组件 或者我需要制作一个视频播放器 通常情况下 这取决于您的要求 您可以使用Silverlight自带的媒体元素 msdn信息在这里 http ms
  • 如何检测两个同时触摸?

    Windows Phone 8 中的触摸检测利用了 System Windows Input Touch FrameReported 事件 该事件是开发人员可用的最原始且响应速度最快的触摸事件 您可以像这样使用该事件 public Main
  • 如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目?

    为了有效地提出我的问题 让我们首先考虑一下我面临的具体场景 常规设置 一个主机 iOS 8 应用程序 与主机应用程序捆绑在一起的一个或多个 iOS 8 扩展 WatchKit Share 等 主机应用程序和所有扩展在共享应用程序组容器中共享