-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Core Data with CloudKit(二) —— 同步本地数据库到 iCloud 私有数据库 | 肘子的Swift记事本 #113
Comments
读完这篇 CloudKit 相关的博文,受益匪浅,有两个小问题想请教:
测试用的项目为 SwiftUI + CoreData,后期尝试加入 CloudKit 同步支持 |
你好,
Unique constraints 是依赖 SQLilte 的内置能力实现的。其SQL代码类似下面的形式:
CREATE UNIQUE INDEX Z_Movie_UNIQUE_color_colors ON ZMOVIE (ZCOLOR COLLATE BINARY ASC, ZCOLORS COLLATE BINARY ASC)
目前只能在保存的时候通过自行编写的代码进行判断。同 Unique constraints一样,在代码中判断指定的属性(或多个属性)是否已经有相同的记录。
对于ordered,如确有需要,可以为托管对象创建计算属性,将对多关系的数据按照自行设定的排序顺序进行返回。相较于使用预置的对多关系返回结果进行排序,自行创建的计算属性性能更好,可控性也更高。
… 2022年1月19日 下午1:36,Chris Akring ***@***.***> 写道:
读完这篇 CloudKit 相关的博文,受益匪浅,有两个小问题想请教:
CloudKit 不支持 Unique constraints,那么在实践中,保证数据唯一性的最佳实践应该是什么呢?
经过测试,勾选了 ordered 的 Relationship 也同样不受 CloudKit 支持,这个有没有其他的替代方案呢?
测试用的项目为 SwiftUI + CoreData,后期尝试加入 CloudKit 同步支持
—
Reply to this email directly, view it on GitHub <#113 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ANIYIGN7EV3FSZ2GQ2H4PLLUWZEVFANCNFSM5F37YEIA>.
You are receiving this because you authored the thread.
|
好的,感谢答疑🙏 |
肘子哥您好,请教个问题,我这有这样一个需求:如果用户不是会员的时候,不同步Core Data到Cloud,如果后来该用户开通了会员,需要将Core Data同步到Cloud,我是否可以通过设置cloudDesc.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "your.cloudKit.container")来控制 |
你好,可以的。cloudDesc.cloudKitContainerOptions 为 nil 时 NSPersistentCloudKitContainer 其实就是个 NSPersistentContainer 。在启动时检查用于是否为会员,从而实现不同的设置可以实现你的需求。不过,如果你只使用一个 container 的话,app 需要在冷启动的情况下,配置才会起作用。也就是说,用户开了会员,只有在下次 app 彻底重启后,同步功能才会被启用。 |
感谢肘子哥答疑,阅读了这个系列的文章受益匪浅。 |
老哥,真机测试时添加数据再删除app重新跑可以还原iCloud的数据,发布到App Store后安装新增数据然后删除app重新安装却不能还原iCloud数据呢?请问是哪里少设置了吗? |
你好。想要根据Attribute来判断这个数据是否要同步到iCloud,我看你有提供了一个方案是用两个container: 但是对于你最后一步的处理看的不是很懂,是否可以更详细的指导下,或是有文章链接吗?在网站找了很久,没有找到把viewContext 的数据同步到viewContext的方式。难道是要把数据查询出来,然后复制一个model,在插入到数据库里吗? 谢谢 |
如果想对同一个 Entity 的数据进行有选择性的同步,也可以只使用一个 container。 |
非常感谢你的回复,我有试过这个方法,但是因为我的数据是一开始保存到本地,只有当满足一定的条件了,才想要推送到iCloud。所以我用这个方法目前报错Can't reassign an object to a different store once it has been saved. |
需要删除原来的数据,在另一个 store 中创建新的。其实封装成一个方法,并不麻烦。 |
你好,请问,笔记中的图片数据也要使用 core data 进行同步吗?开启 Allows External Storage 有没有影响?谢谢。 |
@I-NOCoder 如果数据库需要同步,且图片数据保存在数据库内,那么在同步的过程中,图片数据也会一并进行同步的。开启 allow external storage 不受影响,可以正常同步 |
谢谢,如果图片数据多的话,对 core data 影响大不大? |
@I-NOCoder 启用外部存储的话,不会影响 Core Data 的效率。但是数量量大的话,必然会影响同步的时间。 |
好的,感谢 |
你好,如果我把录音文件保存在文件系统,在core data里保存文件的路径,怎样做才能保证同时录音文件和保存在core data的路径都能使用iCloud同步呢? |
@spencerfeng 如果文件容量较大,可以考虑与 iCloud Documents 结合使用。将文件保存在共享目录中。在另一台设备上,获取到 url 后,需要首先检查当前的状态,如果为占位符,选择下载。如果容量较小,还是推荐保存在 Core Data 中,可以开启保存在外部的选项。这样就无需自己处理同步了。 |
非常感谢🙏 |
“官方文档中这个限制我比较困惑,因为即使不采用网络同步,开发者也通常不会为两个 Configuration 中的实体建立 relationship。如果需要建立联系,通常会采用创建 Fetched Properties” 这里有问题请教,当一些数据为公共数据库,另外一些通过Private数据库进行同步时,此时就无法自然的建立 relationship了。而采用创建 Fetched Properties 是要如何做呢?本来有关系的两个数据,现在因为一个在公共数据库,一个在私有数据库而无法建立relationship。 |
Fetched Properties 其实就相当于预设了谓词的形式进行获取。 |
在keyboard extension中通过viewContext.fetch拿到的不是main app中最新的数据,如何解决? |
@ybwdaisy 的 keyboard extension 没有了解。不过照理来说,应该在 extension 或 widget 中,使用持久化历史跟踪来保证数据的一致性。 |
感谢,我先试试 https://github.com/fatbobman/PersistentHistoryTrackingKit 吧 |
https://www.fatbobman.com/posts/coreDataWithCloudKit-2/
本篇文章中,我们将探讨 Core Data with CloudKit 应用中最常见的场景——将本地数据库同步到 iCloud 私有数据库。
The text was updated successfully, but these errors were encountered: