2016-03-09 52 views
0

**** ****修订如何查找Firebase中提供的值是几个属性之一?

这里是火力布局

"Recent" : {  
"-KCF2_4VmCXn38fbJ07h" : { 
      "counter" : 15, 
      "date" : "2016-03-07T17:44:58", 
      "description" : "Master", 
      "groupId" : "7Z7hoKapTS", 
      "lastMessage" : "AwGABL7h0ZPkXCuKvyu7PF6jcmClkdAT3AgaKkBPkBaA460cexzvpoTqfNSvn+5lILB4++AKBufHmdOIVS1giJ8EeV0V+2Dd6UlGqRvOPNQNvg==", 
      "members" : [ "mf1Q6ogUHD", "mf1Q6ogUHD", "mf1Q6ogUHD", "MvKHg4Hh3L" ], 
      "password" : "JHttZvN9Uw", 
      "profileId" : "MvKHg4Hh3L", 
      "recentId" : "-KCF2_4VmCXn38fbJ07h", 
      "type" : "group", 
      "userId" : "mf1Q6ogUHD" 
     } 
} 

这里是我更新的查询!我现在从firebase中检索我的数组,并将其放入一个NSMutable数组中!现在我需要做的是删除members(我不知道该怎么做)的值,然后写入新的数组!

PFUser *user = [PFUser currentUser]; 
NSString *nsUser = (NSString *)user; 
NSMutableArray *recentIds; 
NSMutableArray *members; 

Firebase *firebase = [[Firebase alloc] initWithUrl:[NSString stringWithFormat:@"%@/Recent", FIREBASE]]; 
FQuery *query = [[firebase queryOrderedByChild:@"groupId"] queryEqualToValue:group.objectId]; 
    [query observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 
     [recentIds addObject:snapshot.value[@"recentId"]]; 
     [members addObjectsFromArray:snapshot.value[@"members"]]; 
     NSLog(@"RecentId: %@", snapshot.value[@"recentId"]); 
    }]; 
     for(id member in members) { 
      if([member isEqual:nsUser]) { 
       [members removeObject:member]; 
       break; 
      } 
     } 

     for(id recentId in recentIds){ 
      Firebase *firebase2 = [[Firebase alloc] initWithUrl:[NSString stringWithFormat: @"%@/members", recentId, @"%@/Recent/", @"https://gibber.firebaseio.com/"]]; 
      [firebase2 setValue: members]; 
     } 
for(id member in members) { 
    NSLog(@"Members: %@", member); 
} 

,然后在端环是遍历已存储在阵列中与构件阵列作为成员节点的值放置在该位置处

+0

您已经在您的问题中包含了JSON树的图片。请将实际的JSON替换为文本,您可以通过点击Firebase数据库中的导出按钮轻松获取该文本。将JSON作为文本可以搜索,使我们能够轻松使用它来测试您的实际数据,并将其用于我们的答案中,并且通常只是一件好事。相同的表格的屏幕截图。请不要发布文字图片。 –

+0

gotcha!等一下!我没有意识到我可以做到这一点! –

+0

除此之外:哪些代码会对您的Firebase数据库进行实际更新?它在'UpdateRecentItem()'中。如果是这样,你可能应该添加代码。 –

回答

2

我认为这种不同的最近的节点声明可以回答这个问题:

从火力地堡网站(这是一个要求,如果你使用数组在火力地堡)

要删除键,我们挽救了整个阵列,而不是使用removeValue

您可能需要考虑替代的Firebase数据结构;如果您要处理特定级别的数据(添加,编辑,删除)。 Array可能不是最好的解决方案。类似下面的例子将提供更多的灵活性。

在您的成员父节点中,将具有用户标识的子节点作为关键字,并将其作为值。然后您可以删除任何一个用户节点。

members 
     pQJlYrHbq2: true 
     BC8MRaq7Zl: true 
     PxOJQe8BdD: true 
     MvKHg4Hh3L: true 

Firebase *ref = [userRef childByAppendingPath(@"members"); 
Firebase *memberToRemove = [ref childByAppendingPath("PxOJQe8BdD") 

[memberToRemove removeValue] 

如果您还没有这样做,从火力地堡看看这个神话般的博客有关数组:

Array's in Firebase

编辑:基于从OP额外的信息,我认为这可能是好的添加代码来读取数组,操作它并将其写回。这段代码非常详细,应该足够清楚,可以遵循。

Firebase *ref = [self.myRootRef childByAppendingPath:@"Recent"]; 

    FQuery *query = [[ref queryOrderedByChild:@"groupId"] queryEqualToValue:@"Pkmwa3WUrH"]; 

    [query observeSingleEventOfType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 

     NSDictionary *dict = snapshot.value; 

     NSString *counter = [dict valueForKey:@"counter"]; //do something with 
     NSString *groupId = [dict valueForKey:@"groupId"]; //counter and the groupId 
     NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[dict valueForKey:@"members"]]; 

     [mutableArray removeObjectAtIndex:1];//remove the object at index 1 

     //now build a path to write the array back out to 
     NSString *nodeKey = snapshot.key; 
     Firebase *path = [ref childByAppendingPath:nodeKey]; 
     Firebase *specificPath = [path childByAppendingPath:@"members"]; 

     [specificPath setValue:mutableArray]; //write the array back out 

    }]; 
+0

啊,这有助于一些,但成员的关键是0 .. *我需要检查的成员儿童的价值,然后删除键,其中的价值是我正在寻找的ID ...另外,如何将我的查询追加到成员中?而不仅仅是消息......我的代码甚至没有让我把snapshot.members放在日志 –

+0

那里我被卡住了,我没有钥匙,但我的确有价值...我需要知道我会如何看待会员,并从ti中删除该项目== me –

+0

你所说的是,你拥有的价值是你想要移除的项目。正如我上面所演示的那样,改变你的逻辑:使值成为关键,值等于真。所以这将是一个关键:值对PxOJQe8BdD:true。如果你这样做,你可以完全避免数组和查询。如果您确实想要查询,请使用我提供的相同结构,然后执行[Deep Query](https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html)以找到你正在寻找的节点。 – Jay

相关问题