我正在尝试实现存储有关用户朋友的数据的功能(请求朋友,收到的朋友请求,已接受的请求)。我有两张桌子。
第一个表是带有用户名列的_User。
第二张桌子是朋友。该表记录了谁是用户的朋友。该表有两个字段:
表_User与Friends表有一对一的关系,但同时有一个数组字段保存用户朋友的信息。在这个数组中,我正在保存其他用户的objectId。我正在使用数组来避免为每个朋友的请求重复行。
拳头我想知道这是一个好主意还是有更好的选择。实际上我有额外的数组列,这是被回收的请求。发送请求。并接受了请求。所有这些都是阵列。
其次我想知道如何编写查询以转到Friends表。查找当前用户行。转到friendList列。返回名称在该数组中的每个朋友的姓名?
目前我这样做:
- (PFQuery *)queryForTable {
//Query user's friend request
PFQuery *query = [PFQuery queryWithClassName:@"Friends"];
[query whereKey:@"user" equalTo:[PFUser currentUser]];
[query includeKey:@"receivedRequest"];
return query;
}
这仅返回使用的ID添加了我当前的用户。我需要来自_User table的名字。
答案 0 :(得分:2)
这就是我要做的事情:
(1)用户类应该是关于用户与应用程序的关系,这是一个位于用户和应用程序之间的数据的位置。
(2)对于用户想要共享的数据,请使用具有图像,昵称等的Persona类.Persona应包含指向User的指针,反之亦然。
(3)Personae(常用角色)邀请朋友成为朋友。
(4)字符串对象ids数组=坏,指针数组=好。事实上,我不能想到我更喜欢字符串对象id而不是指针的情况。
(5)朋友邀请应该是它自己的对象,邀请者和被邀请者是Persona的指针。
(6)友谊是一种双边和对称的关系(至少我们一直希望它们是这样)。一个很好的表示可能是一个友谊类,它有一个指向两个Persona对象的指针的数组。
给定数据模型,以下是一些函数:
Persona有一个指向User的指针,称之为“user
”,而User有一个persona
指针。 FriendInvitation有一个inviter
和invitee
,这两个指向Persona。友谊有一系列指向Persona的两个指针,称之为friends
// get the current user's FriendInvitations
- (void)friendInvitationsWithCompletion:(void (^)(NSArray *, NSError *))completion {
PFObject *persona = [PFUser currentUser][@"persona"];
PFQuery *query = [PFQuery queryWithClassName:@"FriendInvitation"];
[query whereKey:@"invitee" equalTo:persona];
[query includeKey:@"inviter"];
[query findObjectsInBackgroundWithBlock:completion];
}
// get the current user's friendships
// remember, these are not the friends, but the objects that record pairings of friends.
// see the next function for the friends
- (void)friendshipsWithCompletion:(void (^)(NSArray *, NSError *))completion {
PFObject *persona = [PFUser currentUser][@"persona"];
PFQuery *query = [PFQuery queryWithClassName:@"Friendship"];
[query whereKey:@"friends" equalTo:persona];
[query includeKey:@"friends"];
[query findObjectsInBackgroundWithBlock:completion];
}
// get the current user's friends' personae
- (void)friendsWithCompletion:(void (^)(NSArray *, NSError *))completion {
PFObject *persona = [PFUser currentUser][@"persona"];
[self friendshipsWithCompletion:^(NSArray *friendships, NSError *error) {
if (!error) {
NSMutableArray *result = [@[] mutableCopy];
for (PFObject *friendship in friendships) {
NSArray *friends = friendship[@"friends"];
NSInteger indexOfFriend = ([friends indexOfObject:persona] == 0)? 1 : 0;
[result addObject:friends[indexOfFriend]];
}
completion(result, nil);
} else {
completion(nil, error);
}
}];
}
// agree to be friends with someone
- (void)becomeFriendsWith:(PFObject *)friend completion:(void (^)(BOOL, NSError *))completion {
PFObject *persona = [PFUser currentUser][@"persona"];
PFObject *friendship = [PFObject objectWithClassName:@"Friendship"];
friendship[@"friends"] = @[ persona, friend ];
[friendship saveInBackgroundWithBlock:completion];
}
// we could go on, but this should convey the basic ideas