Я использую базу данных Firestore и Swift.
У меня есть набор пользователей и общий набор задач. У каждого пользователя свой набор задач. Когда пользователь регистрируется, я копирую задачи из общего набора задач в собственный набор задач пользователя.
Моя иерархия базы данных Firestore выглядит так:
задачи -> firstBundle -> задачи
пользователи -> userID -> задачи
Все работает до сих пор. Затем я хочу загрузить данные из пользовательской коллекции задач в UITableView. Когда я вручную добавляю задачи в коллекцию задач пользователя, данные отображаются в виде таблицы. Но когда я копирую данные из общего набора задач в набор задач пользователя, данные вообще не отображаются в табличном представлении.
class TasksListScreen: UIViewController {
var db = Firestore.firestore()
var tasksArray = [Task]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
addTasks()
loadData()
}
Вручную добавьте данные в коллекцию задач пользователя, и это работает ( данные добавляются в базу данных и данные о задачах отображаются в виде таблицы):
// push tasks to the db
func addTasks() {
let userID = Auth.auth().currentUser!.uid
let userTasksCollRef = db.collection("users").document(userID).collection("tasks")
userTasksCollRef.addDocument(data: [
"title": "Копійка гривню береже",
"description": "Копійка гривню береже, чули таке? Чи є у Вас скарбничка? Якщо немає - є ідея. Спробуйте створити скарбничку своїми руками. Яка вона буде - справа Ваша. І ще, порада, заповніть ії.",
"tip": "Живеться, якщо копійка ведеться",
"hashtags": "#гроші #збереження #своїми руками"
])
userTasksCollRef.addDocument(data: [
"title": "В здоровому тілі - здоровий дух",
"description": "Зробіть ранкову зарядку або пробіжку на свіжому повітрі.",
"tip": "Фізична активність значно покращує самопочуття на цілий день",
"hashtags": "#розвиток #фізична активність #здоров'я"
])
}
Скопируйте данные из общей коллекции задач (которая была заполнена до этого вручную на стороне базы данных) в пользовательскую коллекцию задачи и добавить скопированные данные в табличное представление.
Данные копируются и появляются в коллекции задач пользователя в базе данных Firestore, но не загружаются в табличное представление.
// push tasks to the db
func addTasks() {
// copy from db.collection("tasks").document("firstBundle").collection("tasks") = tasksFirstBundleCollRef
// to db.collection("users").document(userID) = userRef
let userID = Auth.auth().currentUser!.uid
let userRef = db.collection("users").document(userID)
let tasksFirstBundleCollRef = db.collection("tasks").document("firstBundle").collection("tasks")
tasksFirstBundleCollRef.getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err.localizedDescription)")
} else {
if let snapshot = querySnapshot {
for document in snapshot.documents {
let data = document.data()
let batch = self.db.batch()
let docset = querySnapshot
let newCollRef = userRef.collection("tasks").document()
docset?.documents.forEach {_ in batch.setData(data, forDocument: newCollRef)}
batch.commit(completion: { (error) in
if let error = error {
print(error.localizedDescription)
} else {
print("Successfully copied doc")
}
})
}
}
}
}
}
А вот мой метод загрузки данных из базы данных в tableview:
// load data to the table view from the db
func loadData() {
let userID = Auth.auth().currentUser!.uid
let userTasksCollRef = db.collection("users").document(userID).collection("tasks")
userTasksCollRef.getDocuments { (queryShapshot, error) in
if let error = error {
print("Error loading data: \(error.localizedDescription)")
} else {
self.tasksArray = queryShapshot!.documents.compactMap({Task(dictionary: $0.data())})
print("Data: \(self.tasksArray)")
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
Файл My Task:
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Task {
var title: String
var description: String
var tip: String
var hashtags: String
var dictionary:[String:Any] {
return [
"title": title,
"description": description,
"tip": tip,
"hashtags": hashtags
]
}
}
extension Task : DocumentSerializable {
init?(dictionary: [String : Any]) {
guard let title = dictionary["title"] as? String,
let description = dictionary["description"] as? String,
let tip = dictionary["tip"] as? String,
let hashtags = dictionary["hashtags"] as? String else {return nil}
self.init(title: title, description: description, tip: tip, hashtags: hashtags)
}
}