parsing – 使用关系与指针?

我使用Parse作为我的后端。 在设置对象之间的正确关系时遇到问题。

我基本上有一个名为Post的类,每个post属于一个用户(PFUser),并且在获取post时,我希望用户信息与post一起获取。

@interface Post : PFObject<PFSubclassing> @property (nonatomic, strong) NSDate *time; @property (nonatomic, strong) NSString *title; @property (nonatomic, strong) NSString *body; @property (nonatomic, strong, readonly) PFRelation *user; // User in backed is defined as a relationship to _user @end // Saving the post [post.user addObject:[PFUser currentUser]; [post saveInBackground]; 

这工作正常,并将该post关联到该用户,但是当我稍后尝试获取post时,似乎并不像我可以从PFRelation获取_user的实例。

什么是正确的方法来处理这个? 试图改变PFUser PFUser,但会崩溃,因为它试图调用保存PFUser对象

当你需要一个相关类的长列表,一个数组不工作的时候,或者当你想查询相关的对象,而不是每次加载包含对象时都包含这个列表的时候。

基本上你有4个选项与parsing:

  • 指针 – 对另一个类的单引用(1到0..1)
  • 数组 – 指针的集合,每次加载对象(1到0..n,小列表)
  • 关系 – 指针的集合,就像SQL中的连接表(在你的封面下处理),你必须运行一个查询来加载值(1到0..n)
  • 自定义连接类 – 实际上只是另一个对象(如SQL中的多对多连接),每个指针都加上任何相关信息(1..n到1..n)

在你的情况下,一个简单的指针会做你想做的。

在你的用例中,一个指针比PFRelation更可取。 您可以通过在查询中添加includeKey来包含用户信息:

 [query includeKey:@"user"]; 

在你的文章中获得评论的方法是将每个新评论添加到你的文章中的指针数组。

当您开始使用NoSQL数据库时,很容易陷入旧的SQLish方式。 如果一个计数器是可取的,你可以在注释对象上添加一个云代码afterSave函数,通过向Post中的“comments”数组添加一个指向保存的注释的指针来更新Post类的“comments”列。 这样,当你取得一个post,你也可以使用

 [query includeKey:@"comments"]; 

这将给你邮政和一个查询中的所有意见。 如果你只需要计数,你可以省略includeKey,但是在指针中仍然有一个“注释”数组,所以注释计数就是数组的长度。

您必须从PFRelation对象中创build一个查询,就像这个代码片段(从Parse文档中获取)一样,然后执行显式查询来检索引用的对象:

[[relation query] findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (error) { // There was an error } else { // user(s) } }];

Parse提供了在原始查询中检索被引用对象的可能性,这是通过要求返回用户数据并使用原始查询中的“includeKey:”方法完成的(也就是您为获取post而设置的查询)不只是参考。 但我不确定它是否适用于PFRelation,正如在文档中所述,includeKey对PFObject起作用,PFRelation不是PFObject。 无论如何你都可以试试这个代码,看看它是否有效:

[query includeKey:@"user"]

创build一个PFSubClass

 yourClassName:PFObject with PFSubclassing 

然后在头文件中创build一个指针关系

 @property(nonatomic, strong) PFUser *userLikeRelation; 

添加在m文件中添加

 + (NSString *)parseClassName { return @"parseTableName"; } + (void)load { [self registerSubclass]; } 

最后在查询中查看控制器集关系,当你在parsing数据保存。

 yourClassName *yourClassNameObj = [yourClassName objectWithClassName:[yourClassName parseClassName]]; [yourClassName setUserCommentRelation:[PFUser currentUser]]; 

为了获取数据,您可以使用包含键来获取数据

 [yourClassNameObj includeKey:@"NameofRelation"];