核心数据+iCloud:iCloud Storage只增不减

Posted

技术标签:

【中文标题】核心数据+iCloud:iCloud Storage只增不减【英文标题】:Core data + iCloud:iCloud Storage only increase not decrease 【发布时间】:2015-12-23 01:25:06 【问题描述】:

我正在编写一个具有 iCloud+Core 数据解析的日记应用程序。而我正在开发。我发现即使我尝试在我的应用程序中删除我的日记,iCloud 存储空间也只会增加。我使用一对多。一个是日记(标题,内容,...),许多是照片。起初,我用一些照片创建了一些日记,然后我删除了一些照片。但是iCloud存储只是增加,而不是减少...... 知道这个问题后,我尝试关闭iCloud,将上下文切换到本地Core Date Store,我发现它没有我上面描述的问题。 我不知道为什么会这样。请帮我。谢谢。

这是核心数据模型

这是我在 iCloud Store 中删除照片时 Core Data 的 SQL 输出。

2015-12-23 09:10:27.991 LPDiary[749:215074] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCONTENT, t0.ZDIARYID, t0.ZLOCATION, t0.ZNOTEPAPERNAME, t0.ZRESERVEBINARYDATA1, t0.ZRESERVEBINARYDATA2, t0.ZRESERVEDATE1, t0.ZRESERVEDATE2, t0.ZRESERVESTR1, t0.ZRESERVESTR2, t0.ZTYPE, t0.ZWEATHER, t0.ZWRITEDATE FROM ZLCLDIARY t0 WHERE  t0.ZDIARYID = ? ORDER BY t0.ZWRITEDATE DESC
2015-12-23 09:10:27.992 LPDiary[749:215074] CoreData: annotation: sql connection fetch time: 0.0009s
2015-12-23 09:10:27.992 LPDiary[749:215074] CoreData: annotation: total fetch execution time: 0.0013s for 1 rows.
2015-12-23 09:10:27.995 LPDiary[749:215074] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZIMAGEDATA, t0.ZORDER, t0.ZRESERVESTR1, t0.ZOWNER, t0.Z1PHOTOS FROM ZLCLPHOTO t0 WHERE  t0.Z_PK IN  (?)  
2015-12-23 09:10:27.997 LPDiary[749:215074] CoreData: annotation: sql connection fetch time: 0.0017s
2015-12-23 09:10:27.997 LPDiary[749:215074] CoreData: annotation: total fetch execution time: 0.0026s for 1 rows.
2015-12-23 09:10:28.000 LPDiary[749:215074] CoreData: sql: BEGIN EXCLUSIVE
2015-12-23 09:10:28.000 LPDiary[749:215074] CoreData: sql: DELETE FROM ZLCLPHOTO WHERE Z_PK = ? AND Z_OPT = ?
2015-12-23 09:10:28.007 LPDiary[749:215074] CoreData: sql: UPDATE ZLCLDIARY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2015-12-23 09:10:28.008 LPDiary[749:215074] CoreData: sql: UPDATE Y_UBMETA set YPEERID="mobile~5C6B0588-0876-42C4-88CA-2FC85745ED66", YTRANSACTIONNUMBER=30 WHERE YPEERID="mobile~5C6B0588-0876-42C4-88CA-2FC85745ED66"
2015-12-23 09:10:28.046 LPDiary[749:215074] CoreData: sql: COMMIT
2015-12-23 09:10:28.061 LPDiary[749:215074] CoreData: sql: select YPEERID, YTRANSACTIONNUMBER, Y_PK from Y_UBMETA

【问题讨论】:

【参考方案1】:

Core Data 没有 iCloud 可以正常工作。添加数据时,持久存储会变大,而删除数据时,它会变小。

Core Data 与 iCloud 的工作原理是创建基线数据存储,然后添加修改基线的事务日志。当您添加数据时,会有一个新事务表示要添加数据。当您删除数据时,会有一个新事务说要删除数据。但是事务实际上并没有删除数据——它只是说应该删除数据,这样当重放事务时,数据就会被删除。

在某些时候,Core Data 应该将所有事务压缩到一个新的基线中。届时将删除已删除的数据。但是,Apple 没有记录这种情况何时发生,我不确定它是否确实发生过。

这就是为什么您会看到不同的结果,具体取决于是否为 Core Data 启用了 iCloud。

【讨论】:

这是否意味着这是 iCloud 的错误,存储永远不会免费? 我不知道解决方法。您应该就此向 Apple 提交错误。

以上是关于核心数据+iCloud:iCloud Storage只增不减的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - iCloud 行为

iCloud - NSCoding 或核心数据

核心数据 + iCloud 同步 NSPersistentStoreDidImportUbiquitousContentChangesNotification

这里发生了啥?核心数据/iCloud

iCloud 核心数据迁移

核心数据迁移到 iCloud