NSPersistentStoreDidImportUbiquitousContentChangesNotification未在iOS设备上触发

时间:2013-03-03 22:13:49

标签: core-data icloud nspersistentstore

我已经使用SQLite日志设置了核心数据以使用iCloud,我已经打开了Core Data和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

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

非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:1)

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

不要这样做:

development.rb

相反,请执行:

"NSPersistentStoreDidImportUbiquitousContentChangesNotification"

答案 1 :(得分:0)

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

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

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

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

为该应用程序连接到iCloud但未执行任何自己的事务的设备只会包含receipt.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容器并重新启动以防万一你的普遍存储中出现问题(标准响应几乎每个Core Data iCloud难题!)。