将 Firebase 数据合并到表视图中
Posted
技术标签:
【中文标题】将 Firebase 数据合并到表视图中【英文标题】:Merging Firebase Data into Table View 【发布时间】:2017-03-13 03:20:26 【问题描述】:首先,我在 Firebase 中存储了 2 组数据。我会将这两组都包含在一张照片中。
第一张照片显示了我保存所有用户个人资料的位置。
当有人在应用程序上签到时,我会将他们的用户名和签到时间存储在不同的地方。
在上面的照片中,您将能够看到当前有 2 个用户在“12-3-2017 Block 2”签到
我存储数据没有问题。
但是我在显示数据时确实遇到了问题。
我希望能够创建一个 UITableView 来显示所有已签入的用户以及他们签入的时间,而在同一个列表中显示所有尚未签入的用户。
import UIKit
import Firebase
struct checkInStruct
let userName : String!
let hour : String!
let minutes : String!
let userNameFromAllUsers : String!
class checkInDaysTableViewController: UITableViewController
//Variables
var lastChildNameSegue = ""
var posts = [checkInStruct]()
let user = FIRAuth.auth()?.currentUser
override func viewDidLoad()
super.viewDidLoad()
self.navigationItem.title = "\(lastChildNameSegue)"
print("Name of Child After Segue -> \(lastChildNameSegue)")
loadCheckedInUsers()
loadAllUsers()
print(posts)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return posts.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
let userName = posts[indexPath.row].userName
let hour = posts[indexPath.row].hour
var minute = posts[indexPath.row].minutes
let userNameOfAllUsers = posts[indexPath.row].userNameFromAllUsers
let label1 = cell?.viewWithTag(1) as! UILabel
let label2 = cell?.viewWithTag(2) as! UILabel
if(hour == nil || hour == "")
//Users isnt signed in
label1.text = "\(userName!)"
label2.text = "User Not checked in"
else
label1.text = "\(userName!)"
label2.text = "\(hour!):\(minute!)"
return cell!
func loadCheckedInUsers ()
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("checkins").child("\(lastChildNameSegue)").queryOrderedByKey().observe(.childAdded, with: (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hourSnapValue = snapshot.value as? NSDictionary
let hour = hourSnapValue?["hour"] as? String
let minutesValue = snapshot.value as? NSDictionary
let minutes = minutesValue?["minutes"] as? String
print(userName!)
print(hour!)
print(minutes!)
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
)
func loadAllUsers()
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with: (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hour = ""
let minutes = ""
print(userName!)
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
)
如您所见,我将数据存储在一个结构中。
但是,在应用程序上,它同时显示了所有用户数据库中的用户名和签入用户。
在屏幕截图中,您会看到“Brandon Happy”有一个签入时间,然后他再次出现,说他从未签入过。如何从结构中删除重复的数据?
【问题讨论】:
【参考方案1】:一切看起来都不错,但是如果结构已经存在,您应该做的是不要将数据添加到结构中,因此您需要做的是修复您的 loadAllUsers() 函数。
func loadAllUsers()
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with: (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hour = ""
let minutes = ""
print(userName!)
databaseRef.child("users").child("\(userID!)").child("checkins").child("\(self.lastChildNameSegue)").observeSingleEvent(of: .value, with: (snapshot) in
if snapshot.hasChild("\(userName!)")
print("User already checked in")
else
print("user has not yet checked in")
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
)
)
在 if 语句中,它会判断用户是否已签入,如果尚未签入,则将其添加到结构中。
【讨论】:
以上是关于将 Firebase 数据合并到表视图中的主要内容,如果未能解决你的问题,请参考以下文章