标签: cloudkit

将CloudKit RecordID保存到CoreData

我有一系列CloudKit记录,并希望将记录ID存储到核心数据中,因此当我再次查询云时,我不会记下相同的记录.我只是做一个不包含核心数据记录的NSpRedicate.

但是,如果出现错误,如何将记录ID保存到核心数据.认为这是一个类型问题.

现行代码:

 coreData.recordRecordID = self.cloudKitRecords[0].recordID as? String
Run Code Online (Sandbox Code Playgroud)

当前得到CKRecord作为String的错误总是失败,我并不感到惊讶.需要能够保存recordID然后从核心数据中获取recordID.

谢谢

core-data swift cloudkit

7
推荐指数
2
解决办法
1529
查看次数

CloudKit 错误“坏容器”(5/1014);“无法从服务器获取容器配置“iCloud.com.abc.def”">

我是云套件的新手,有人可以帮助我解决错误,因为我正在尝试在我的公共数据库中添加记录并获取此错误。

“坏容器”(5/1014);“无法从容器“iCloud.com.abc.def”的服务器获取容器配置”

谢谢 。

ios cloudkit

6
推荐指数
2
解决办法
4195
查看次数

CloudKit:CKFetchRecordChangesOperation、CKServerChangeToken 和 Delta 下载

我的问题与 WWDC 2014 Advanced CloudKit 中命名的“Delta Download”有关。

我正在尝试为我的 Core Data 应用程序进行同步,该应用程序目前仅适用于 iPhone(想想:只有一台设备处于活动状态)。因此,对于目前的大多数情况,基本上该应用程序会将来自同一设备的用户记录存储在云中。

我无法理解基于CKFetchRecordChangesOperationDelta 下载的自定义区域功能。

正如我做对的那样,我们必须CKServerChangeToken维护同步操作(我的意思是只下载那些被其他设备添加/修改/删除的记录),正如 WWDC 上所展示的那样。但是,我无法理解的是,我们只有在 之后才会收到该令牌CKFetchRecordChangesOperation,当我们将记录保存到云端时,我们不会获得新的令牌。

如果我们使用当前可用的令牌进行 fetch(因为它只在 fetch 之后改变),我们会收到从我们之前的保存操作中保存的记录。基本上,我们会获得设备上已有的保存记录。为什么?我在这里遗漏了什么?

如果我们将一些数据播种到云端(从设备 A),设备 B 正在获取区域记录的情况是合理的,但如果设备 A 是?重新下载所有记录?

recordChangeTagCKRecord,这是一个属性,我可以用来解决与本地对象的冲突 - 获取的对象(相同或不同的版本),如果是这样,有人可以举出我需要如何执行此操作的示例:保存时将 recordChangeTag 保存到核心数据第一次录制到 CloudKit 还是如何录制?

缺乏文档是一件令人头疼的事。

synchronization nsoperation ios icloud cloudkit

6
推荐指数
1
解决办法
1130
查看次数

仅获取 cloudkit 中的特定字段?

我只想获取 CloudKit 音乐记录中的 Song_Name 字段。我正在尝试下面的代码,但它仍然获取音乐记录中的所有字段。我想我需要使用 publicDB.add(operation) 方法编译操作,但它不允许我像现在使用 publicDB.perform(query, in....) 那样声明“results”

 let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Musics", predicate: predicate)
    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["Song_Name"]

    publicDB.perform(query, inZoneWith: nil) { [unowned self] results, error in

        guard error == nil else {
            DispatchQueue.main.async {
                self.delegate?.errorUpdating(error! as NSError)
                print("Cloud Query Error - Refresh: \(error)")
            }
            return
        }
        self.items_music.removeAll(keepingCapacity: true)
        for record in results! {
            let music = Musics(record: record, database: self.publicDB)
            self.items_music.append(music)
        }
        DispatchQueue.main.async {
            self.delegate?.modelUpdated()
        }
    } …
Run Code Online (Sandbox Code Playgroud)

field ios swift cloudkit

6
推荐指数
1
解决办法
1174
查看次数

在我的本机应用程序中将文件备份到 icloud

寻找 react-native 库或开发方法来存档以下内容:

我的用例

在我的本机应用程序中,我想将图片(由用户拍摄)和其他文件(如用户数据库“realm.db(来自 realmjs)”)与用户 iCloud 驱动器同步。

我是否需要使用 cloudkitjs 将所有文件上传到网络,或者是否可以将文件放入特定的应用程序目录中,并且每次用户更新 iphone 设备时 -> 应用程序都会自动同步?

我已经尝试过的

  • 在我的应用程序中激活 iCloud 支持
  • 创建 iCloud 容器

要求

  • 一切都应该在用户/客户 iCloud 驱动器中同步
  • 不想关心 GDPR 指南
  • 只有一个 iOS 应用程序存在......无需在 MacOS 和 iOS 之间同步数据

我的堆栈

  • 反应原生 0.60
  • 打字稿

非常感谢让我朝着正确方向前进的任何帮助。

realm icloud cloudkit react-native realm-js

6
推荐指数
0
解决办法
654
查看次数

CloudKit+Core Data 在生产中突然停止同步

我向 App Store 提交了一个 iOS 应用程序,该应用程序完全按照此处的描述实现了 CloudKit+CoreData:https ://www.andrewcbancroft.com/blog/ios-development/data-persistence/getting-started-with-nspersistentcloudkitcontainer/

在我的设备上,我的应用程序是直接从 Xcode 下载的,并且同步继续完美运行。

但是,在从 App Store 下载应用程序的用户设备上,同步运行了几天,然后突然停止。现在就好像我的用户的两个设备都只切换到本地存储。对一个所做的更改再也不会在另一个上看到了。所有设备从一开始就登录了 iCloud,并且设置没有改变。Signing 和 Capabilities 下的所有信息在 Debug 和 Release 中都是相同的。

这可能是苹果方面的错误吗?我在持久容器的实现中遗漏了什么,或者我需要在 Xcode 中更改什么?

core-data ios swift cloudkit

6
推荐指数
1
解决办法
223
查看次数

Android:如何在同一用户的设备之间同步存储在 Room 数据库中的应用程序数据?

我正在开发一个在本地存储用户数据的应用程序。我已经使用Room数据库将用户创建的数据存储在 Android 设备中。现在,如果用户拥有不止一台设备,那么数据应该可以在他们的所有 (Android) 设备上使用,而无需任何中央数据库或 Web 服务。

注意:对于 iOS 端,我曾经CloudKit在 iOS 设备之间同步数据。有没有办法对 Android 设备做同样的事情?请注意,我不想将数据存储在任何中央数据库或网络服务器或任何中央云存储上。它应该只归用户所有。(即它应该通过用户的谷歌帐户同步)。 注意:我想要一个原生的 android 解决方案,不需要跨平台(Android 到 iOS)同步。

更新:到目前为止,我发现了一些选项,如Firestore实时数据库,一些 AWS 服务也提供同步工具,但所有这些的问题在于它们都将用户数据存储在中央云位置。

所以我的问题仍然是一样的 - 有没有办法在使用Google Drive或类似的东西的android 设备之间同步数据,我们可以利用用户自己的云存储,而不是将用户数据存储在中央数据库中。

android cloudkit android-room google-cloud-firestore

6
推荐指数
1
解决办法
2655
查看次数

NSPersistentCloudKitContainer 将 NSManagedObject 子类恢复为历史值

我有一个用于NSPersistentCloudKitContainer与 iCloud 同步数据的应用程序。用户报告偶尔数据丢失,之后我开始调试我的实现。

我的应用程序实现的一部分是显示一个弹出窗口,其中显示信息并有一个确认按钮。当用户单击此按钮时,自定义NSManagedObject子类的一个或多个实例将被修改。

同时,NSPersistentCloudKitContainer在应用程序退出并激活时触发镜像过程。当用户单击上述确认按钮时会发生这种情况。它通过执行NSCloudKitMirroringExportRequestNSCloudKitMirroringImportRequest请求来做到这一点。

换句话说,在我的应用程序中,数据同时被修改(通过代码显式)和镜像(通过 CloudKit 隐式),这就是出错的地方。

本质上是这样的:

  1. 子类NSTimeInterval实例的属性 ( )NSManagedObject增加(例如 0 + 1 = 1)。
  2. NSPersistentCloudKitContainer 当应用程序激活或退出时隐式开始镜像数据。
  3. 在此过程中但在完成之前,该属性再次增加(例如 1 + 1 = 2)。
  4. 在内部,镜像过程完成。

在这个阶段,我希望属性的值与最新的(本地)更改相匹配(因此在我的示例 2 中)。但相反,它匹配初始增量(因此在我的示例 1 中),覆盖我最新的(本地)更改导致数据丢失。显然,NSCloudKitMirroringImportRequest恢复到镜像进程启动时的状态,这也可以在日志中看到:

CoreData: debug: CoreData+CloudKit: -[PFCloudKitImporterZoneChangedWorkItem applyAccumulatedChanges:error:]
[…]
Importing updated records:
(
    "<CKRecord: 0x10225b560; recordID=5458F9C8-7BE2-4563-92DE-650ED4C643F5:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=23, values={\n    \"CD_activity\" = \"3E497A4C-6467-48F4-B7F4-6F1B2B7BC779\";\n    \"CD_date\" = \"2020-04-26 07:28:00 +0000\";\n    \"CD_duration\" = \"1\";\n    \"CD_entityName\" = Mutation;\n}, recordType=CD_Mutation>"
)
Run Code Online (Sandbox Code Playgroud)

在这个阶段,我不确定这是否是NSPersistentCloudKitContainer …

macos nsmanagedobject swift cloudkit nspersistentcloudkitcontainer

6
推荐指数
0
解决办法
214
查看次数

使用 CloudKit 的 CoreData:模型迁移后,所有内容都被复制

我尝试迁移我的 CoreData-Model(使用 CloudKit),它复制了我存储的所有对象。在 CloudKit 中使用 CoreData 时如何正确迁移?

概括

我在 CloudKit 中使用 CoreData。几天前,我对模型进行了一些更改,因此需要进行迁移。事情是这样的(详情见下文):

  1. 我只是在我的模型 ( Model.xcdatamodel) 中进行了更改,没有更改模型的版本并将其安装在我的 iPhone 上进行测试 -> 崩溃并显示消息“无法迁移就地存储:尝试迁移期间违反约束”。

  2. 我创建了模型的新版本 ( Model 2.xcdatamodel) 并在那里进行了更改。然后我创建了一个.xcmappingmodel来管理迁移。没有崩溃并且它起作用了,但是......

  3. 我的应用程序中的所有条目现在都重复了,这当然不是预期的。

我在模型中改变了什么:

我的原始(源)模型有两个实体 A 和 B。A 和 B 之间存在多对多映射。我做了以下更改。

  • 添加两个新实体 C 和 D,具有一个数据字段(“名称”)
  • 在两个新实体 C、D 和我现有实体之一 (A) 之间创建一对多映射

我只是创建了.xcmappingmodel-file 而没有更改其中的任何内容。对于现有实体 A 和 B,它具有接管先前数据的条目,如下所示:

destination attribute: name
value expression: $source.name
Run Code Online (Sandbox Code Playgroud)

对于现有的映射 AB(实体 B 称为“标签”),它具有: FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "TagToTag", $source.tags) 与逆关系类似。

我如何构建我的 CoreData 堆栈

我遵循了 Apple 的文档。我的代码看起来像这样(我做了一个CoreDataManager-class):

[...]
lazy …
Run Code Online (Sandbox Code Playgroud)

core-data core-data-migration ios swift cloudkit

6
推荐指数
1
解决办法
253
查看次数

iOS15 B4 NSPersistentCloudKitContainer“帐户暂时不可用”错误

我在 iOS15 beta 4 上使用 NSPersistentCloudKitContainer 来跨设备同步核心数据。在设备上启动并登录 iCloud 时,我在日志中收到以下错误:

<NSCloudKitMirroringResult:0x28167ae60>成功:0 madeChanges:0错误:<CKError 0x2818a94d0:“帐户暂时不可用”(1028/2011);“由于身份验证令牌错误或丢失,帐户暂时不可用”>

我有以下代码:

init(inMemory: Bool = false) {
        container = NSPersistentCloudKitContainer(name: "AppName")
        if inMemory {
            let storeDescription = NSPersistentStoreDescription(url: URL(fileURLWithPath: "/dev/null"))
            container.persistentStoreDescriptions = [storeDescription]
        } else {
            let storeURL = URL.storeURL(for: "my.app.group", databaseName: "AppName")
            let storeDescription = NSPersistentStoreDescription(url: storeURL)
            storeDescription.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.my.app")
            container.persistentStoreDescriptions = [storeDescription]
        }
        
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

ios swift cloudkit nspersistentcloudkitcontainer

6
推荐指数
1
解决办法
511
查看次数