Ios Parse.com:使用查询获取数组列(关系)
我有一个Ios Parse.com:使用查询获取数组列(关系),ios,parse-platform,pfquery,Ios,Parse Platform,Pfquery,我有一个PFQueryTableViewController子类,它向Parse.com表查询名为messages的列的数据,该列属于数组类型 查询返回数据,但消息为空数组的情况除外(尽管表和消息字段中有数据) 下面是我为解析数据创建的查询: - (PFQuery *)queryForTable { PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; [query whereKey:@"user"
PFQueryTableViewController
子类,它向Parse.com表查询名为messages
的列的数据,该列属于数组类型
查询返回数据,但消息为空数组的情况除外(尽管表和消息字段中有数据)
下面是我为解析数据创建的查询:
- (PFQuery *)queryForTable {
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query whereKey:@"user" equalTo:[PFUser currentUser]];
[query includeKey:@"messages"];
return query;
}
奇怪的是,一旦我更新了Parse对象并保存它,重新加载表数据就会获取数组列的数据
知道它为什么在初始查询中返回空数组吗
编辑:
查询结果的NSLog()输出(来自-(void)objectsDidLoad:
):
上面的parseObject类就是我要查询的。保存消息的方式非常耗时。因为您还没有等待“newMessage”被保存。所以它的ID值可能为空
通过将下一个代码放入完成块中,确保首先保存newMessage对象
Message *newMessage = [[Message alloc] init];
[newMessage saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(succeeded){
if (!self.parseObject.objectId) {
self.parseObject = [[MyParseObject alloc] init];
[self.parseObject setUser:[User currentUser]];
}
[[self.parseObject messages] addObject:newMessage];
[self.parseObject saveInBackground];
}
}];
如果看不到Message和MyParseObject类的定义,我就不会有多大帮助了 如果你发布更多的代码,这会有所帮助。什么代码创建了关系?什么代码保存它?如何调用queryForTable
,以便确保保存已完成?@piojo,请参阅更新。另外,queryForTable
由控制器自动调用。是否在save函数之后立即调用您的查询函数?如果是这样,数据可能还没有保存。或者部分保存,保存的是用户对象,而不是newMessage
。但我能想到的还有其他一些事情可能会出错,但我只是对发生的事情知之甚少。此外,如果我们陷入了一些棘手的问题,比如哪些对象需要按什么顺序创建(以及什么时候需要保存才能使用),这对我来说是站不住脚的。parseObject
对象与newMessage
对象的指针一起保存。只是查询并没有返回其余的数据,它是一个数组类型的列。我在“关系”部分的文档中遵循了这个示例(关系使用数组部分)。
Message *newMessage = [[Message alloc] init];
//... set message properties
[newMessage saveInBackground];
if (!self.parseObject.objectId) {
self.parseObject = [[MyParseObject alloc] init];
[self.parseObject setUser:[User currentUser]];
}
[[self.parseObject messages] addObject:newMessage];
[self.parseObject saveInBackground];
Message *newMessage = [[Message alloc] init];
[newMessage saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(succeeded){
if (!self.parseObject.objectId) {
self.parseObject = [[MyParseObject alloc] init];
[self.parseObject setUser:[User currentUser]];
}
[[self.parseObject messages] addObject:newMessage];
[self.parseObject saveInBackground];
}
}];