解析存储本地数据存储对象以进行缓存和清除它们?

时间:2015-11-18 22:45:21

标签: ios objective-c parse-platform pfquery local-datastore

我正在以标准方式将对象存储到Parse本地数据存储区:

[someObject pinInBackgroundWithName:someName];

一般来说,这很好用。但是,有时当我进行本地查询时,即

PFQuery *query = [SomeObject query]; 
[query fromLocalDatastore];
[query fromPinWithName:someName];
[query findObjectsInBackgroundWithBlock:block];

似乎没有本地对象,我收到错误:

error   NSError *   domain: @"Parse" - code: 120

我理解为:

"Error code indicating the result was not found in the cache."

我认为本地数据存储区和缓存是2种完全不同的存储机制?然而,似乎我的数据被保存到缓存中,然后被刷新。怎么会这样?如果从我的控制中刷新本地数据存储区并没有多大用处......

更新

我最初认为这是因为我在后台写入时正在访问本地数据存储区,因此得到的结果为零。但是将我的固定放在主线程上并不能解决这个问题。

然后我认为它可能是一个递归固定的错误,因为我的对象包含指向指向对象的指针。但明确地固定所有指针并没有帮助 - 无论是在后台还是在主线程上。

我尝试在没有includeKey的情况下查询对象,我认为这意味着一致的返回,但是检索剩余数据所需的辅助查询对于我正在尝试的事情来说有点慢。

最后,我认为这可能与this bug

有关

写入任何新数据似乎会删除所有以前的固定数据......

3 个答案:

答案 0 :(得分:0)

请检查用于从解析请求/存储对象的查询限制,因为默认limitSize = 100并将其设置为最大值1000(一次最多返回1000个结果)。

[query setLimit: 1000]; //the default is 100.

答案 1 :(得分:0)

更新:我现在非常确定nil返回是因为我包含了尚未获取的对象的键。因此,它不是返回附加了nil对象的对象数组,而是返回nil。因此,如果您使用一堆包含密钥查询本地数据存储区,请确保首先在本地数据存储区中存在所有包含的数据。否则返回nil。

原始答案:

我还没有想到这一点,但有一个解决办法。我试图避免使用它,但经过几天的摆弄,它似乎是唯一的解决方案。

不要在原始查询中包含任何'includeKey'。这样做,至少在我的情况下,似乎擦除了本地数据存储区。任何后续查询都可以正常工作,但如果您退出应用程序并重新打开它,或者写入任何新数据,则第一个查询将始终擦除存储并返回nil对象。

因此,当您需要访问它指向的任何内容时,查询单个对象然后fetchFromLocalDatastore。

我找到了建议herehere(感谢@PowHu)但我在网上找不到关于这个问题的其他信息。

答案 2 :(得分:0)

您尝试固定包含指向其他对象的指针的对象。 这是一个parse.com本地数据存储错误!这是一个解决方法:

  

尝试首先固定内部对象,然后仅在该引脚之后固定包装器对象。