2

我已经使用 SQLite 日志设置了核心数据以与 iCloud 一起使用,我同时打开了核心数据和 SQLite 日志并在我的架构中达到了 3 级,这些都不会在从本地存储或云中获取或放置数据时产生错误店铺。

我的本地存储存储所有 SQLite 数据,而云存储配置为仅移动 2 个实体,因为所有本地存储都不需要更新。

记录持久存储时,它们都会出现。

在 developer.icloud.com 上,该文件夹用于存储数据,有两个子文件夹(一个用于 iPad,另一个用于 iPhone)。每个文件夹中都有两个子文件夹和一个receipt.0.cdt文件。

即使一切似乎都已设置,但当我在我的应用程序中操作两个实体之一时,NSPersistentStoreDidImportUbiquitousContentChangesNotification永远不会触发(在任一设备上)。

即使本地数据存储(保存所有实体的本地副本)已更新,并且此更改也会反映在 UI 中。

这是被操纵的商店(在操纵发生时记录)

2013-03-03 22:02:49.826 Clueless[1168:907] MOC P-Stores: (
        "<NSSQLCore: 0x1d5b1180> (URL: file://localhost/private/var/mobile/Library/Mobile%20Documents/<id~com~company~appname>/Data.nosync/CategoryModel.sqlite)",
        "<NSSQLCore: 0x1d5ca280> (URL: file://localhost/var/mobile/Applications/EEBE0D5E-1AC0-4A11-AA4B-FB9A63A7F95A/Documents/CategoryModel.sqlite)"
    )

下面是我操作实体后产生的数据的日志:

2013-03-03 22:02:49.836 Clueless[1168:907] CoreData: sql: BEGIN EXCLUSIVE
2013-03-03 22:02:49.839 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.842 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.844 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)18
2013-03-03 22:02:49.845 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.851 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.861 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.863 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)13
2013-03-03 22:02:49.865 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.866 Clueless[1168:907] CoreData: sql: UPDATE ZSYMBOL SET ZANSWERSTATE = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.868 Clueless[1168:907] CoreData: details: SQLite bind[0] = 2
2013-03-03 22:02:49.870 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)2
2013-03-03 22:02:49.875 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)8
2013-03-03 22:02:49.878 Clueless[1168:907] CoreData: details: SQLite bind[3] = (int64)1
2013-03-03 22:02:49.880 Clueless[1168:907] CoreData: sql: COMMIT
2013-03-03 22:02:49.909 Clueless[1168:907] CoreData: sql: pragma page_count
2013-03-03 22:02:49.911 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0026s
2013-03-03 22:02:49.913 Clueless[1168:907] CoreData: sql: pragma freelist_count
2013-03-03 22:02:49.915 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0021s

这真的让我感到困惑,因为在加载或向数据存储中添加数据时不会产生错误,所以理论上它应该可以工作。

非常感谢你的帮助!!

4

2 回答 2

1

对于仍在试图弄清楚为什么他们没有收到此通知的人:将通知的名称提供为常量而不是字符串(Swift 中的代码)。

不要这样做:

"NSPersistentStoreDidImportUbiquitousContentChangesNotification"

相反,请执行以下操作:

NSPersistentStoreDidImportUbiquitousContentChangesNotification
于 2015-05-07T09:01:32.650 回答
0

在我看来,您的数据库存储是为 iCloud 创建的,但没有放入任何内容。

收据.0.cdt 文件出现在通过 iCloud 使用该应用程序的每台设备的事务日志文件夹中,但仅在最初出现(在商店创建时,或从另一台设备连接到现有商店时)。实际包含数据的事务日志命名更像:

FFFE99DC-87D7-5CBE-BFD8-32E11-D3E934.1.cdt

并且大小与该事务中插入/更新/删除等记录的数量成正比。这些事务日志出现在与生成这些事务的设备相关的 iCloud 设备文件夹中。

已为该应用程序连接到 iCloud,但未执行任何自己的交易的设备将只包含收据.0.cdt 文件。

如果你解压缩receipt.0.cdt,你最终会得到一个文本文件——所有这些似乎都包含对生成这些事务日志的设备的引用(尽管最初是空的)。

mobile.DEVICE_ID:NUMBER_OF_TRANSACTIONS

然后这表明:

mobile.DEVICE_TWO:2:mobile.DEVICE_ONE:4

因此receipt.0.cdt 只是针对连接到iCloud 中该商店的每台设备记录的交易数量的内务参考。

集中精力确保您实际上将数据放入您的iCloud存储(使用正确的上下文,不会与本地存储上下文等混淆),然后实际保存它。

如果这些都不起作用,请尝试吹走整个 iCloud 容器并重新开始,以防万一您的 ubiquity 存储中出现问题(对几乎每个 Core Data iCloud 难题的标准响应!)。

于 2013-03-16T14:41:58.717 回答