【原】使用Bmob作为iOS后台开发心得——查询关联关系(BmobRelation)

本文转载请注明出处 —— polobymulberry-博客园

简介

Bmob中的数据关联分为Pointer和Relation两种(数据关联在我开发app过程中使用还是很频繁的,也算个难点。虽然之前没有学过数据库,但是觉得还是有必要熟悉和掌握它),对此,Bmob官方文档已经介绍得很详细了。

基本上查看文档就可以解决大部分数据关联的问题(Bmob的文档真心要赞一下)。这里我记录下当时我最难理解的一个部分——查询关联关系

还是使用官方文档的事例来学习(这一处官网有些地方的objectId书写错了,记录下时间2015-09-14)。

Post表(所有用户发表的文章都放在Post表中content指文章内容,title指文章标题,author是Pointer类型,指向_User表)

relationship_7

_User表(username表示用户名,password表示用户密码)

relationship_8

举例

我们的任务是查询(喜欢Post表中objectId为a397e97451这篇文章的所有用户,简单说就是查找objectId为a397e97451文章中likes中关联(Relation)的所有User)

   //关联对象表
    BmobQuery *bquery = [BmobQuery queryWithClassName:@"_User"];

    //需要查询的列
    BmobObject *post = [BmobObject objectWithoutDatatWithClassName:@"Post" objectId:@"a397e97451"];
    [bquery whereObjectKey:@"likes" relatedTo:post];


    [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
        if (error) {
            NSLog(@"%@",error);
        } else {
            for (BmobObject *user in array) {
                NSLog(@"%@",[user objectForKey:@"username"]);
            }
        }
    }];

以上时官网给出的查询代码。但是我一开始实在无法理解这种查询方式,bquery明显和“likes”和post不是一条路上的。直到我看到了下面这句话:

跟Pointer不同的是,此处Relation查询的本质是_User表。

所以上面代码实际上做的是什么工作了?

1.因为我们要找的是所有喜欢这篇文章的User,所以我们先在_User表中查找所有User。

2.但是我们上一步所找到的User很多不喜欢这篇文章,所以得有一个筛选方法。而这个筛选方式就是whereObjectKey:relatedTo:,relatedTo指向的就是我要查询的那篇文章,而whereObjectKey指向的就是该文章对应的User关联关系。至于为什么要加whereObjectKey,是因为Post表中可能有多个关联User的关系,比如后期可能加入所以点评该文章的用户(关联User的关系)。我们可以这样理解,上一步的bquery中存放着_User表中所有User,而Post的likes中存放的是喜欢该文章User的objectId(或指针之类的统一标识)。然后遍历所有User,找到对应objectId相等的User,存取下来,作为查找结果。(以上纯属猜测!!!)

NSMutableArray *searchResult = 初始化;
for(BmobUser *user in _User表中所有User)
{    
if (user.objectId 等于post的likes中某个objectId )  
    {         
        [searchResult addUser:user];
    }
}
return searchResult; // 存放了所要查询的User

总结

715314-20150914194236023-1507138033

原文地址:https://www.cnblogs.com/polobymulberry/p/4808209.html