如果在申请好友时增加了属性,在申请发送成功后,_Followee 表中也会增加一条数据,代表着发起申请的 A 的好友为 B,其 user 列为用户 A,followee 列为用户 B, friendStatus 列的值为 false,代表着 B 没有接受过 A 的好友申请。属性值会被存储到相应的列中,例如上方的代码会在 _Followee 表中新增 group 列,其值为 sport。
// first `true` means that results will contain entire user info.
// second `true` indicates that all requests are sent to current user.
// you can look at the method signature for more details.
currentUser.friendshipRequestQuery(AVFriendshipRequest.STATUS_PENDING, true, true).findInBackground().subscribe(new Observer<List<AVFriendshipRequest>>() {
@Override
public void onSubscribe(@NotNull Disposable disposable) {
}
@Override
public void onNext(@NotNull List<AVFriendshipRequest> avFriendshipRequests) {
}
public void onError(Throwable throwable) {
}
public void onComplete() {
}
});
// parameter `isFollowerDirection` indicates following direction:
// true - query follower of current user, in other words users which followed current user.
// false - query followee of current user, in other words users which current user followed.
AVQuery<AVFriendship> query = currentUser.friendshipQuery(false);
query.whereEqualTo(AVFriendship.ATTR_FRIEND_STATUS, true);
query.addDescendingOrder(AVObject.KEY_UPDATED_AT); // you can add more ordering attrubite.
query.findInBackground().subscribe(new Observer<List<AVFriendship>>() {
@Override
public void onSubscribe(Disposable disposable) {}
@Override
public void onNext(List<AVFriendship> avFriendships) {}
public void onError(Throwable throwable) {}
public void onComplete() {}
});
好友关系开发指南
阅读此文档前请先阅读数据存储开发指南,了解数据存储的基础。
LeanCloud 将好友关系分为两种。一种是单向关注,例如微博里面被关注者及粉丝,这种方式不需要好友申请,每一个人都可以随时关注另一个人。另一种是互为好友,例如微信好友,需要双方互相认为对方是自己的朋友后才能确立好友关系,在这种方式下 A 需要向 B 申请成为好友,B 同意后双方互为好友。
不管是哪一种好友关系,数据都会被存储在
_Followee
表或_Follower
表中。单向关注
在这种关系模式中,我们分为了
Follower
和Followee
两种类型,分别表示用户的粉丝和用户的关注,在控制台中对应着两张表_Follower
和_Followee
。当用户 A 成功关注用户 B 后,我们可以发现在_Follower
和_Followee
表中各自新增了一条数据。权限管理
好友关系接口向
_Follower
及_Followee
表存储数据时默认使用friendshipACL
,更改其中一个表的friendshipACL
,另一张表的friendshipACL
也会随之更改。在应用控制台 -「存储」-「结构化数据」-「_Followee 或 _Follower 表」- 「权限」中可以看到默认的friendshipACL
设置。其中包含三个选项:SDK
关注某个用户
我们允许在 follow 的时候同时传入一个 attributes 字典,用于设置关系的属性,这些属性都将在
_Follower
和_Followee
表同时存在:取消关注某个用户
查询我关注的人
我们使用
FollowerQuery
和FolloweeQuery
对关注关系进行查询。FollowerQuery
和FolloweeQuery
返回的Query
对象可以像普通的Query
对象那样使用,它们本质上都是查询数据管理平台中的_Follower
和_Followee
表,你可以添加 order、skip、limit 以及其他 where 条件等信息。查询我的粉丝
他人关注了我,他人就是我的粉丝,查询粉丝的方法如下:
通过 AVQuery,你也可以增加
skip
或者limit
操作来分页查询,比如:你也可以查找某个特定的粉丝,比如:
总之
followerQuery
和followeeQuery
返回的 AVQuery 可以增加其他查询条件,只要在_Followee
和_Follower
表里存在的属性都可以作为查询或者排序条件。一次性获取粉丝和关注列表
下面的方法实现了一次获取粉丝和关注用户列表的功能,当然,你也可以用上面的方法通过两次调用来获取这些数据,特别是用户列表很长需要翻页的时候,下面的方法就失效了。
向粉丝展示动态
如果希望像微博那样向自己的粉丝发布状态,请继续阅读社交信息流组件。
REST API
使用这里的 API 来建立用户关系,你可以关注、取消关注某个用户。
where
、order
、skip
、limit
、count
、include
等。如果没有特殊说明,返回的结果都是{results: [数组结果]}
,跟其他查询 API 保持一致。_Follower
和_Followee
表中都存储为 Pointer 类型,因此如果要查询出用户信息,应该加上 include 指定字段。关注和取消关注用户 API
通过操作
/users/:user_id/friendship/:target_id
资源可以关注或者取消关注某个用户,其中::user_id
表示发起关注动作的用户的 objectId。如果设置了X-LC-Session
头,则self
表示当前登录用户。:target_id
表示想要关注的目标用户的 objectId。例如,让当前用户
51fa6886e4b0cc0b5a3792e9
关注目标用户51e3a334e4b0b3eb44adbe1a
:关注后,
_Follower
和_Followee
都会多出一条记录,如果在 控制台 > 数据存储 > 服务设置 > 其他设置 勾选了 应用内社交模块,关注用户时自动反向关注,会各多出两条记录。取消关注通过:
关注还可以增加一些属性:
那么
score
字段将同时出现在_Follower
和_Followee
表,可以作为查询或者排序条件。修改当前关系的属性:
查询粉丝或者关注者列表 API
查询粉丝列表(也就是关注我的人),可以通过:
返回的用户列表是 Pointer 类型,如果想要将用户信息也返回,需要 include:
查询关注的用户列表:
同时查询粉丝和关注的人:
结果返回:
如果指定 count=1,则返回结果里加上 followers_count 和 followees_count 表示粉丝数目和关注者数目:
获取互相关注的用户列表
_Followee
表中的一列,如果是 followee 列,则会返回该 followee 在_User
表的详细信息,例如 nickname, shortId, avatar 等。_Followee
表中返回的列,如果是 Pointer 对象,支持用.
来限定 Pointer 对象中的列。_Followee
表的 where 查询条件。不支持指定针对 user 和 followee 字段的查询条件。结果返回:
互为好友
除了单向关注外,我们还经常见到的一个场景为, 用户 A 申请加用户 B 为好友,在 B 同意后两人加为好友。我们使用
_FriendshipRequest
表及_Followee
表来实现这种场景。_FriendshipRequest
表用来存储所有申请,_Followee
表用来存储好友数据。权限管理
好友关系接口向
_Followee
表存储数据时默认使用friendshipACL
。在「应用控制台 > 数据存储 > 结构化数据 >_Followee
表 > 权限」中可以看到默认的friendshipACL
设置。其中包含三个选项:SDK
申请加为好友
申请加某人为好友之前,需要当前用户先登录。登录后申请好友的代码如下:
发送申请成功后,我们可以发现
_FriendshipRequest
新增了一条数据,并且其status
字段的值为pending
,表示这是一个正在进行中的好友申请。在发起好友请求时,可以提前为朋友设置一些属性。属性字段可以任意指定自己需要的 key 和 value,例如分组为「sport」:
如果在申请好友时增加了属性,在申请发送成功后,
_Followee
表中也会增加一条数据,代表着发起申请的 A 的好友为 B,其user
列为用户 A,followee
列为用户 B,friendStatus
列的值为false
,代表着 B 没有接受过 A 的好友申请。属性值会被存储到相应的列中,例如上方的代码会在_Followee
表中新增group
列,其值为sport
。查询好友申请
用户上线登录后,可以立刻查询有谁向自己发起了好友申请:
接受好友申请
用户 A 向用户 B 发起好友请求,用户 B 接受用户 A 的好友请求后:
_FriendshipRequest
表中该条申请数据的status
的值会被更新为accepted
。_Followee
表中已有的user
为用户 A 及followee
为用户 B 的数据,其friendStatus
的值会被更新为true
,代表着 B 是 A 的好友。_Followee
表中新增user
为用户 B 的数据,其followee
值为用户 A,friendStatus
的值为true
,代表着 A 是 B 的好友。B 在接受 A 的好友请求时,同样可以添加属性,这些属性会被存储到
_Followee
表的相应的列中,例如下方的代码会向 B 的数据中的group
列中存入值music
。拒绝好友申请
拒绝好友请求后,
_FriendshipRequest
表中该条申请数据的status
的值会被更新为declined
。注意,当用户 B 拒绝 A 的好友申请后,用户 A 无法再次发起好友申请。如果两人重新希望成为好友,用户 B 需要找到之前被拒绝的好友申请,改为接受:
查询好友列表
直接使用
Query
查询好友列表,设定friendStatus=true
即可以查询双向好友。同时还可以使用 skip、limit、include 等,非常方便。修改好友属性
在申请好友的过程中,可以随时修改好友属性:
删除好友
当 A 不再希望和 B 是朋友,可以删除好友。注意:删除好友只会删掉
_Followee
表中用户 A 的好友数据,而用户 B 的好友数据依然保留。也就是说 A 不再视 B 为好友,而在 B 的好友列表中依然有 A。REST API
申请加为好友
返回为包含 _FriendshipRequest 表 objectId 的 JSON 数据:
查询好友申请
查询好友申请和普通表的查询相同,详细请参考查询约束。
接受好友申请
请求 URL 中的
request-object-id
指的是申请好友时返回的objectId
,也是_FriendshipRequest
表的objectId
。返回为包含 _FriendshipRequest 表 objectId 的 JSON 数据:
拒绝好友申请
请求 URL 中的
request-object-id
指的是申请好友时返回的objectId
,也是_FriendshipRequest
表的objectId
。返回为包含 _FriendshipRequest 表 objectId 的 JSON 数据:
删除好友申请
objectId
在申请好友时会返回。删除成功:
查询好友列表
好友列表存于
_Followee
表,查询方式和普通表的查询相同,详细请参考查询约束。修改好友属性
删除好友
其中:
user_id
表示发起删除动作的用户的 objectId。如果设置了X-LC-Session
头,则self
表示当前登录用户。target_id
表示要删除的朋友的 objectId。订阅好友通知
如果有需求,可以通过 LiveQuery 来订阅
_Followee
表和_FriendshipRequest
表的数据变动。订阅数据下发的事件通知尊重数据的 ACL。这里仅给出简单的示例代码,详细内容请阅读 LiveQuery 开发指南例如当用户在线时,希望能立刻受到好友申请的通知:
例如当其他人通过/拒绝我的好友申请时,收取通知: