迭代iPhone地址簿导致地址簿sql数据库损坏



我的应用程序有一个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.

你可以在这里阅读更多。

我已经确认,如果你从多个线程读,数据库会损坏,用户会丢失他们所有的联系人。

最新更新