Parse - Using relations versus pointers?

前端 未结 4 533
生来不讨喜
生来不讨喜 2020-12-28 09:49

I am using Parse as my backend. I have problems setting up the correct relation between objects.

I basically have a class named Post, each post belongs to a user(PFU

相关标签:
4条回答
  • 2020-12-28 10:35

    You must create a query from the PFRelation object, like in this code snippet (taken from Parse documentation) and do an explicit query to retrieve the referenced object:

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

    Parse provides the possibility to retrieve also referenced objects in the original query, and this is done using the "includeKey:" method in the original query (that is the query you setup to get the posts), by asking to return the user data and not just the reference. But I'm not sure if it works for PFRelation as in the documentation it is stated that includeKey works for PFObject and PFRelation is not a PFObject. You may try this code in any case and see if it works or not:

    [query includeKey:@"user"]

    0 讨论(0)
  • 2020-12-28 10:42

    In your usecase, a pointer is preferable over a PFRelation. You can include the user info by adding includeKey in your query:

    [query includeKey:@"user"];
    

    A way to get a comment count on your post is to add every new comment to an array of pointers in your Post.

    It is easy to get stuck in the old SQLish ways when you start using NoSQL databases. If a counter is desirable, you could add a cloud code afterSave function on the comment object that updates the "comments" column of the Post class by adding a pointer to the saved comment to the "comments" array in Post. This way, when you fetch a post you can also use

    [query includeKey:@"comments"];
    

    which will give you the Post AND all the comments in one query. If you only need the count, you ommit the includeKey, but you still have an array in "comments" with the pointers, so the comment count is the length of the array.

    0 讨论(0)
  • 2020-12-28 10:44

    A Relation is for when you want a long list of related classes, where an array doesn't work, or when you want to query the related objects as needed and not have the list included every time you load the containing object.

    Basically you have 4 options with Parse:

    • Pointer - single reference to another class (1 to 0..1)
    • Array - collection of pointers, loaded with the object every time (1 to 0..n, small lists)
    • Relation - collection of pointers, like a join table in SQL (handled under the covers for you), you must run a query against it to load values (1 to 0..n)
    • Custom join class - really just another object (like many-to-many join in SQL) with a Pointer to each side plus any related information (1..n to 1..n)

    In your case a simple Pointer would do what you want.

    0 讨论(0)
  • 2020-12-28 10:44

    Create A PFSubClass like

    yourClassName:PFObject with PFSubclassing 
    

    and then in the header file create a Pointer relation

    @property(nonatomic, strong) PFUser *userLikeRelation; 
    

    add in m file add

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

    finally in the View Controller set relation in query when you are save data in parse.

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

    for fetching data you can get data with include key

    [yourClassNameObj includeKey:@"NameofRelation"];
    
    0 讨论(0)
提交回复
热议问题