解析 - 使用关系与指针?

时间:2014-05-04 17:12:10

标签: ios parse-platform

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

我基本上有一个名为Post的类,每个帖子都属于一个用户(PFUser),在提取帖子时我希望用帖子提取用户信息。

@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];

这很好用并且将帖子与该用户联系起来,但是当我稍后尝试获取帖子时,我似乎无法从PFRelation获取_user的实例。

处理此问题的正确方法是什么? 尝试将PFRelation更改为PFUser,但这会因为尝试在PFUser对象上调用save而崩溃

4 个答案:

答案 0 :(得分:21)

关系适用于需要长列表的相关类,数组不起作用,或者想要根据需要查询相关对象以及每次加载包含对象时都不包含列表的情况。

基本上你有2个Parse选项:

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

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

答案 1 :(得分:3)

在您的用例中,指针优于PFRelation。您可以通过在查询中添加includeKey来包含用户信息:

[query includeKey:@"user"];

在帖子中获取评论数量的一种方法是将每个新评论添加到帖子中的一系列指针中。

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

[query includeKey:@"comments"];

将在一个查询中为您提供帖子和所有评论。如果你只需要计数,你省略了includeKey,但你仍然在指针的“comments”中有一个数组,所以注释计数是数组的长度。

答案 2 :(得分:2)

您必须从PFRelation对象创建一个查询,就像在此代码段(取自Parse文档)中一样,并执行显式查询以检索引用的对象:

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

Parse提供了在原始查询中检索引用对象的可能性,这是使用&#34; includeKey:&#34;原始查询中的方法(即您设置的查询以获取帖子),通过要求返回用户数据而不仅仅是引用。但我不确定它是否适用于PFRelation,因为在文档中声明includeKey适用于PFObject而PFRelation不是PFObject。您可以在任何情况下尝试使用此代码,看看它是否有效:

[query includeKey:@"user"]

答案 3 :(得分:0)

创建像

这样的PFSubClass
yourClassName:PFObject with PFSubclassing 

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

@property(nonatomic, strong) PFUser *userLikeRelation; 

添加m文件添加

+ (NSString *)parseClassName {

    return @"parseTableName";

}

+ (void)load {

    [self registerSubclass];

} 

当你在解析中保存数据时,最终在查询控制器中设置关系。

yourClassName *yourClassNameObj = [yourClassName objectWithClassName:[yourClassName parseClassName]];

[yourClassName setUserCommentRelation:[PFUser currentUser]];

用于获取数据,您可以使用包含密钥

获取数据
[yourClassNameObj includeKey:@"NameofRelation"];