2016-07-03 2 views
1

Не имея каких-либо удачи, получая мой проект IOS для запроса моих игроков друзей рекордами:Firebase 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 не совпадает с значением 12345

Обоснование звучит как queryEqualToValue ожидает AnyObject, а Int64 не соответствует AnyObject.

Однако преобразование его в String делает его строкой, а не значением, и оно хранится в Firebase как значение.

Таким образом, решение либо

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

Как я могу видеть в ваших данных, вы не сохраняете FBID как String, поэтому нет необходимости лить его в String при выполнении queryEqualToValue.

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 *, которые могут быть классом, stuct или enum или * AnyObject *, который специально предназначен для типов классов. queryEqualToValue ожидает AnyObject, а Int64 не соответствует AnyObject, так как это не класс, это тип значения. AnyObject может показаться, что удерживает Int, но те случаи, где за кулисами AnyObject неявно преобразует Int в __NSCFNumber.Таким образом, это должно быть либо String, либо преобразовать в Int с: let num = Int (fbid), а затем: fbidQuery.queryEqualToValue (num) – Jay

+0

@Jay благодарит Джей. Просто отредактировал ответ, учитывая ваши мысли. – adolfosrs

0

Проблема оказалась правила безопасности. Вот правила, которые работали для меня, с комментарием, где я должен был добавить строку.

Поскольку у @Jay был хороший ответ, который помогает сохранять данные разумными (хотя это и не было основной причиной проблемы), я тоже проголосовал за это.

Извините, что не публиковали ранее правила безопасности. Должен был подумать об этом.

// 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" 
     } 
    } 
    } 
} 

Обратите внимание, что и раньше у меня была строка:

".indexOn": "FBID"

внутри «$ UID» сферу, и перенес ее, как показано выше, после того, как на стороне клиента библиотеки из через echo предупреждая, что записи не были проиндексированы и предлагают переместить его в область «пользователи».

Это предупреждение было тем, что заставило меня взглянуть на правила безопасности и привести к исправить.

Спасибо за вашу помощь.

Смежные вопросы