2016-07-03 12 views
1

내 선수 친구의 최고 기록을 조회하는 내 아이폰 OS 프로젝트를 얻고있는 행운을 가지고 있지 작동하지 :중포 기지 queryOrderedByChild queryEqualToValue이

private func checkFriendsScores(fbid: Int64) 
{ 
    let users = ref.child("users") 
    let fbidQuery = users.queryOrderedByChild("FBID") 
    let friendIdNumber = String(fbid) 
    let queryFriend = fbidQuery.queryEqualToValue(friendIdNumber) 
    queryFriend.observeSingleEventOfType(.Value) { [unowned self](snapshot: FIRDataSnapshot!) in 
     self.updateFriendsScores(fbid, data: snapshot) 
    } 
} 

그 코드를 컴파일하고 잘 실행, 앱의 다른 부분은 노력하고 있습니다. 쿼리는 지정된 FBID를 가진 친구를 찾은 다음 updateFriendScores 함수를 실행하지만 해당 블록은 실행되지 않습니다.

{ 
    "users" : { 
    "WhiPPS6AbcX6Xp2XQft29JZXR9G3" : { 
     "BK035" : [ null, 540, 466, 515, 576, 748, 1019, 765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
     "FBID" : 10208576492403564 
    }, 
    "d0fT2ge6ALa6QUKFcRApiqjaJd82" : { 
     "BK018" : [ null, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646 ], 
     "BK035" : [ null, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
     "FBID" : 1652501845074069 
    }, 
    "o67iatcYLRbd2CrgkXGQWZNpmyC3" : { 
     "BK018" : [ null, 816, 715, 642, 690, 864, 745, 899, 858, 847, 1045, 1148, 1002, 1119, 833, 1067, 0, 0, 0, 0, 0 ], 
     "BK035" : [ null, 826, 620, 657, 673, 810, 1090, 804, 932, 931, 1079, 1007, 972, 1098, 1065, 927, 1582, 1195, 1265, 1366, 1548 ], 
     "FBID" : 1094051894000026 
    }, 
    "yW5ntKW9pwYvwm2EyvJlGSTzm0M2" : { 
     "BK018" : [ null, 763, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
     "BK035" : [ null, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
     "FBID" : 10153916083832933 
    } 
    } 
} 

어떤 아이디어 :

데이터는 같다?

답변

3

문제는 Int64를 문자열로 변환하여 쿼리를 수행한다는 것입니다. 12345 문자열 queryEqualToValue AnyObject가 기대대로 추론 소리 12345

의 값과 동일하지 않으며, Int64를 AnyObject에 부합하지 않는다.

그러나 문자열로 변환하는 것은 그것을 아닌 문자열 값을 만들고,이를 값으로 중포 기지에 저장된.

그래서 해결책은 그냥 장기적으로 너무 쉽게 데이터를 처리 만들면서 내가) C로 갈거야 중 하나

a) Use Int values in general instead of converting to strings 
b) Type conversion to an Int. let num = Int(fbid) and then 
     fbidQuery.queryEqualToValue(num) 
c) Avoid the issue completely any store/retrieve those numbers as a string in Firebase 

입니다.

0

데이터에서 볼 수 있듯이 FBIDString으로 저장하지 않으므로 queryEqualToValue을 수행 할 때 String으로 캐스팅 할 필요가 없습니다.

private func checkFriendsScores(fbid: Int64){ 
    let users = ref.child("users") 
    let fbidQuery = users.queryOrderedByChild("FBID") 
    let queryFriend = fbidQuery.queryEqualToValue(Int(fbid)) 
    queryFriend.observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     let BK035 = snapshot.value!["BK035"] as! NSArray 
     self.updateFriendsScores(fbid, data: snapshot) 
    }) { (error) in 
     print(error.localizedDescription) 
    } 
} 
+1

Int64는 var를 처리하는 가장 좋은 방법이 아닐 수 있습니다. Swift에서 사용할 수있는 Any 'thing'에는 두 가지 유형이 있습니다. * Any *는 클래스, stuct 또는 enum 일 수 있으며 * AnyObject *는 클래스 유형 전용입니다. queryEqualToValue는 AnyObject가 필요하고 Int64는 클래스가 아니므로 AnyObject를 준수하지 않으므로 값 유형입니다. AnyObject는 Int를 포함하는 것처럼 보일 수 있지만 그 경우는 AnyObject가 암시 적으로 Int를 __NSCFNumber로 변환합니다.그래서 그것은 String이거나 Int로 변환 될 필요가 있습니다. let num = Int (fbid) 그리고 fbidQuery.queryEqualToValue (num) – Jay

+0

@Jay thanks Jay. 귀하의 생각을 고려하여 대답을 편집했습니다. – adolfosrs

0

문제 보안 규칙으로 밝혀졌다. 저를 위해 일한 규칙은, 나가 선을 추가해야 한 곳에 논평과 더불어, 여기있다. (이 문제의 근본 원인 아니었지만) @Jay는 데이터 제정신을 유지하는 데 도움이 좋은 답을 가지고 있기 때문에

은 나뿐만 아니라 것을 업 투표를했습니다. 이전 보안 규칙을 게시하지 않는

죄송합니다. 그 생각을 했어야했다.

".indexOn": "FBID"

은 "$의 UID"범위 내, 및 클라이언트 측 라이브러리가를 echo'ed 후 위와 같이로 이동 : 또한 이전에 내가 선을했다

// These rules grant write access to a "users" node matching the authenticated 
// user's ID from the Firebase auth token; and read access to all "users" nodes 
// Since we will look up our friends via their Facebook ID's we need to index on 
// that value 
{ 
    "rules": { 
    "users": { 
     ".read": "auth != null",  // <<< Had to add this line 
     ".indexOn": "FBID", 
     "$uid": { 
     ".read": "auth != null",  // <<< This was not enough 
     ".write": "$uid === auth.uid" 
     } 
    } 
    } 
} 

주 레코드가 인덱싱되지 않았다고 경고하고 "사용자"범위로 이동하도록 제안했습니다.

은 경고 나 보안 규칙을보고 수정에 그 리드 있었는지 가지고있다.

도움 주셔서 감사합니다.