Как получить персональный список пользователей в Firebase к табличному виду - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь просто выбрать любимые карты пользователей в виде таблицы.что-то, что я думал, было бы очень простым, но оказалось чрезвычайно трудным.

Код здесь - лучшее, что мне удалось до сих пор, Попытка как-то ссылаться на (идентификатор пользователя) с (идентификатором yourmaps)чтобы получить конкретную информацию.

Например.Так как пользователь сделал 1 карту своей любимой (с идентификатором (-LpY4XEER-b21hwMi9sp)).Я хочу просмотреть все карты в корне ["yourmap"] и получить только его карту в виде таблицы.

Firebase

"users" {
  "6g55cHXH4begwooHQvO4EKNV3xm1" : {
    "photoURL" : "https://firebasestorage.googleap...",
    "username" : "lbarri",
    "yourmaps" : {
      "-LpY4XEER-b21hwMi9sp" : true
    }
  }
}


"yourmaps": {
  "-LpY4XEER-b21hwMi9sp" : {
    "author" : {
      "photoURL" : "https://firebasestorage.googleapis.com/v...",
      "uid" : "6g55cHXH4begwooHQvO4EKNV3xm1",
      "username" : "lbarri"
    },
    "mapmoderators" : {
      "6g55cHXH4begwooHQvO4EKNV3xm1" : true
    },
    "mapphotoURL" : "https://firebasestorage.googleapis...",
    "mapusername" : "Hello World"
  },
  "-LpYo_pQ8zIOGHHlNU1Q" : {
    "author" : {
      "photoURL" : "https://firebasestorage.googleapis.com/v...3",
      "uid" : "RLFK9xnvhccTu2hbNHq0v05J2A13",
      "username" : "lbarri"
    },
    "mapmoderators" : {
      "RLFK9xnvhccTu2hbNHq0v05J2A13" : true
    },
    "mapphotoURL" : "https://firebasestorage.googleapis.com/...",
    "mapusername" : "Dream"
  }
}

Swift

    func getCurrentUserMaps() {
        guard let userProfile = UserService.currentUserProfile else { return }
        let currentUserId = userProfile.uid

        let userRef = Database.database().reference().child("users").child(currentUserId)
        userRef.observeSingleEvent(of: .value, with: { (snapshot) in

            let root = snapshot.value as? NSDictionary

            if let mapsByUser = root!["yourmaps"] as? [String: Bool] {
                for (documentId, status) in mapsByUser {
                    if status {
                        // Document is true, check for the maps
                        self.fetchyourmaps(key: documentId, owner: currentUserId)
                    }
                }
            }
        }) { (error) in
            print(error.localizedDescription)
        }
    }
    func fetchyourmaps(key:String, owner:String) {
        let yourMapRef = Database.database().reference().child("yourmaps")
        yourMapRef.observeSingleEvent(of: .value, with: {snapshot in
            let user = snapshot.value as? NSDictionary

            if let mapsByUser = user!["mapmoderators"] as? [String: Bool] {
                for (userId, status) in mapsByUser {
                    if userId == owner && status == true {
                        print("Owner \(owner) manages this \(user)")

                        var tempYourMap = [YourMapProfile]()
                        for key in (snapshot.value as? NSDictionary)! {
                            let childSnapshot = key as? DataSnapshot
                            let dict = childSnapshot!.value as? [String:AnyObject]                           
                            let author = dict!["author"] as? [String:AnyObject]
                            let uid = author!["uid"] as? String      
                            let username = author!["username"] as? String
                            let photoURL = author!["photoURL"] as? String
                            let url = URL(string:photoURL!)
                            let mapusername = dict!["mapusername"] as? String

                            let mapphotoURL = dict!["mapphotoURL"] as? String
                            let mapurl = URL(string:mapphotoURL!)

                            let userProfile = UserProfile(uid: uid!, username: username!, photoURL: url!, mapPoints: mapPoints!)
                            let yourmapprofile = YourMapProfile(mapid: childSnapshot!.key as! String, mapauthor: userProfile, mapusername: mapusername!, mapphotoURL: mapurl!)

                            tempYourMap.append(yourmapprofile)

                        }
                        self.yourmaps = tempYourMap
                        self.tableView.reloadData()
                    }
                }
            }
        })
    }

print("Owner \(owner) manages this \(user)") выводит правильные карты на консоль

После этой строки наступает время, когда я не могу понять, как упаковать информацию в мое табличное представление.

Я искал везде информацию о том, как извлечь данные из Firebase при обращении одной корневой папки к другой, но я не могу найти ничего полезного.Так что любая ссылка / руководство / учебник и т. Д. Будут оценены, и я с удовольствием возьму его оттуда.Это по крайней мере, как вы должны это сделать?

1 Ответ

1 голос
/ 27 сентября 2019

Есть несколько способов сделать это, но вот два: Вариант 1 - использовать глубокий запрос, чтобы получить карты, которые являются фаворитами этого пользователя.Второй - перебирать пользовательские карты и извлекать каждую из них по очереди.

Вариант 1:

Начать с узла карт, подобного этому

allMaps
   map_0
      favorite_of
         uid_0: true
         uid_3: true
      map_user_name: "Larry"
   map_1
      favorite_of
         uid_2: true
      map_user_name: "Moe"
   map_2
      favorite_of
         uid_0: true
      map_user_name: "Curly"

Затем,глубокий запрос, чтобы получить все любимые карты uid_0

func queryToGetMyFavoriteMaps() {
    let uid = "uid_0"
    let ref = self.ref.child("allMaps")
    let path = "favorite_of/" + uid
    let query = ref.queryOrdered(byChild: path).queryEqual(toValue: true)
    query.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            print(child) //prints the map_0 & map_2 nodes since that's the favorite onces
        }
    })
}

Option 2

Измените узел allMaps, поскольку мы не будем выполнять запрос

allMaps
   map_0
      map_user_name: "Larry"
   map_1
      map_user_name: "Moe"
   map_2
      map_user_name: "Curly"

и тогда пользовательский узел будет выглядеть примерно так

users
   uid_0
      name: "Frank"
      favorite_maps:
         map_0: true
         map_2: true
   uid_1
      name: "Leroy"
      favorite_maps:
         map_1: true

, а затем код, который читает узел fav_maps uid_0, получает ключи из этого снимка и затем выполняет итерацию по ним, читая узлы карты по одному ввремя.

func iterateToGetFavoriteMaps() {
    let uid = "uid_0"
    let userRef = self.ref.child("users").child(uid)
    userRef.observeSingleEvent(of: .value, with: { snapshot in
        if let mapRefs = snapshot.childSnapshot(forPath: "favorite_maps").value as? [String: Any] {
            let mapKeys = mapRefs.keys //note mapKeys is a Dict so we can directly access the keys
            for key in mapKeys {
                let mapRef = self.ref.child("allMaps").child(key)
                mapRef.observeSingleEvent(of: .value, with: { mapSnapshot in
                    let name = mapSnapshot.childSnapshot(forPath: "mapUserName").value as? String ?? "No Name"
                    print(name)
                })
            }
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...