我的应用程序有一个NSOperation,可以打开iphone地址簿,遍历用户的联系人,并将名称和电话号码复制到Core Data实体中。大部分时间这都没有问题,但很少看起来地址簿被破坏,所有联系人都丢失了。我没有写任何写入地址簿,所以不确定这是怎么发生的。它不会抛出堆栈跟踪或崩溃应用程序。我再次运行我的应用程序后才注意到它。我在日志中看到以下内容......
CPSqliteStatementSendResults:文件是加密的还是不是数据库checkResultWithStatement:文件是加密的还是不是SELECT UID的数据库,标识符,(SELECT值FROM ABMultiValueLabel WHERE ROWID = label),值FROM ABMultiValue WHERE record_id =? AND property + 0 =?;
......而且地址簿是空的。
是否可以通过阅读或不正确地关闭地址簿来删除地址簿?
这件事发生在我之前。
您正在从两个不同的线程访问相同的AB实例,并且通讯簿不是线程安全的。
您需要使用ABAddressBook Create()来获取要在每个单独线程上使用的实例。
从文档:Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance.
你可以阅读更多关于它here。
我已经确认,如果您从多个线程读取,数据库将损坏,用户将失去所有联系人。