我正在尝试在iOS上使用local-datastore。
说我有两个或更多设备。
我使用saveEventually在本地(和云端)保存数据。只在一台设备上工作时,它可以正常工作。
当我开始使用多个设备时,要同步我使用:
PFQuery *query = [UserPreference query];
[query whereKey:@"userId" equalTo: [PFUser currentUser].objectId];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error){
if(!error){
[UserPreference pinAllInBackground:objects block:^(BOOL succeeded, NSError *error) {<---- objects here are fine
if(succeeded){
[query fromLocalDatastore];
NSLog(@"Local %@", [(UserPreference*)[[query findObjects] objectAtIndex:0] filterContext ]); <--- however here the old value is retrieved
}
}];
}
}];
所以我从云中获得了正确的对象,然后我PinAll但是当我从localDataStore中检索时,会检索旧的值吗?
任何人都可以善意解释: 1.如果这是可行的,即使用本地数据存储在两个设备之间进行同步 2.我做错了什么?
PS:我注意到对象中的serverData包含正确的信息但不更新对象
答案 0 :(得分:3)
这似乎有效。因此,当您从服务器获得更新时,您需要取消所有具有名称的对象,然后使用相同的名称将它们固定。之后,您可以查询pinWithName:
PFQuery *query = [UserPreference query];
[query whereKey:@"userId" equalTo: [PFUser currentUser].objectId];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if(!error){
[UserPreference unpinAllObjectsInBackgroundWithName:@"userPreference" block:^(BOOL succeeded, NSError *error) {
[UserPreference pinAllInBackground:objects withName:@"userPreference"];
}];
}
答案 1 :(得分:1)
我有相同的要求,我发现上述有用,但有一些其他数据和其他人可能认为有用的不同选项。
我也有两个设备。所有数据都在本地数据存储区中并推送到解析服务器,这很有效,我可以在服务器上看到数据。但是,当我使用相同的帐户详细信息登录第二个新设备时,我无法获取所有数据。
登录后:
[PFUser logInWithUsernameInBackground:user password:pass block:^(PFUser *user, NSError *error) {
if (user) { /* success, user object is in local datastore */ }
}];
如果成功,则可以使用与用户对象关联的任何数据。但是必须要求与该用户相关的任何其他对象。因此,通过用户对象访问的字段存在,但是与用户对象相关的记录不存在。我发现以下内容可以获取其他数据:
PFQuery *query = [PFQuery queryWithClassName:@"History"];
[query whereKey:@"user" equalTo:[PFUser currentUser]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if(!error){
NSLog(@"Fetched %lu objects", (unsigned long)[objects count]);
for (PFObject* item in objects)
[item pinInBackground];
} else {
NSLog(@"Parse error pulling data after login: %@ %@", error, [error userInfo]);
}
}];
最后,如果您希望服务器上的数据发生变化,您必须进行轮询。我已经通过网络上的解析登录更新了服务器上的数据,至少我没有看到这些更改传播到设备。我必须用查询将它们拉下来然后固定它们。