我的应用程序有一个NSOperation打开iphone地址簿,循环遍历用户的联系人并将姓名和电话号码复制到Core Data实体中。大多数情况下,这没有问题,但很少出现地址簿损坏和所有联系人丢失的情况。我没有给地址簿写任何东西,所以不确定这是怎么发生的。它不会抛出堆栈跟踪或使应用程序崩溃。我只在再次运行应用程序后才注意到它。我在日志中看到如下内容…
CPSqliteStatementSendResults:文件被加密或不是数据库checkResultWithStatement: SELECT UID, identifier, (SELECT value FROM ABMultiValueLabel WHERE ROWID = label), value FROM ABMultiValue WHERE record_id = ?
AND property+0 = ?…通讯录是空的
是否有可能通过读取地址簿或不正确关闭地址簿来丢弃它?
这种事以前也发生在我身上。
您正在从两个不同的线程访问同一个AB实例,并且地址簿不是线程安全的。
你需要使用ABAddressBookCreate()来获得一个实例在每个单独的线程上使用。
来自文档:Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance.
你可以在这里阅读更多。
我已经确认,如果你从多个线程读,数据库会损坏,用户会丢失他们所有的联系人。