Reputation: 2025
I am trying to update the values on a realm database. If a user selects a row containing values I want to be able to update the values of that row. Here is my code but instead of updating, it creates another value in the database
func updateTodoList(todoList: TodoListModel, name: String, description: String, createdDate: Date, remiderDate: Date, photo: Data, isCompleted: Bool) -> Void {
try! database.write {
if name != "" {
todoList.name = name
} else {
todoList.name = "No extra information"
}
todoList.desc = description
todoList.createdDate = createdDate
todoList.remiderDate = remiderDate
todoList.photo = photo
todoList.isCompleted = false
}
}
my did select row
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let todoList = todoItems?[indexPath.row]
let storyBoard: UIStoryboard = UIStoryboard(name: "AddTodoListSB", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: Constants.ADD_TODO_SB) as! AddTodoListVC
newViewController.loadViewIfNeeded()
let min = Date()
let max = Date().addingTimeInterval(60 * 60 * 60 * 60)
guard let itemPhoto = UIImagePNGRepresentation(newViewController.imageView.image!) else {return}
newViewController.picker.minimumDate = min
newViewController.picker.maximumDate = max
// newViewController.showDateTimePicker(sender: <#T##AnyObject#>)
newViewController.picker.completionHandler = { date in
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
self.title = formatter.string(from: date)
let reminder = formatter.string(from: date)
TodoListFunctions.instance.updateTodoList(todoList: todoList!, name: newViewController.titleTxtField.text!, description: newViewController.moreInfoTxtView.text!, createdDate: (todoList?.createdDate)!, remiderDate: formatter.date(from: reminder)!, photo: itemPhoto, isCompleted: false)
}
tableView.reloadData()
self.present(newViewController, animated: true, completion: nil)
}
// TodolistModel
class TodoListModel: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var name: String = ""
@objc dynamic var desc: String = "No Description"
@objc dynamic var photo: Data? = nil
@objc dynamic var createdDate: Date?
@objc dynamic var remiderDate: Date?
@objc dynamic var isCompleted = false
override static func primaryKey() -> String? {
return "id"
}
let parentCategory = LinkingObjects(fromType: CategoryModel.self, property: "items")
}
further codes would be supplied on request
Upvotes: 3
Views: 2886
Reputation: 100503
To update an object it must have a primary key and after you edit it use
// if it doesn't exist it'll be added
database.add(editedObjc, update: true)
//
// create object 1 , note: r = database
let lista = TaskList()
lista.pid = 1
lista.name = "Whole List"
// create object 2
let lista2 = TaskList()
lista2.pid = 2
lista2.name = "Whole List 2"
// add to database by write
r.add([lista,lista2])
let stored = r.objects(TaskList.self)
print("before edit" , stored)
// edit name of object 2
lista2.name = "qqwwqwqwqwqwqwqwq"
// update the object after changing it's name
r.add(lista2, update: true)
let stored2 = r.objects(TaskList.self)
print("after edit" , stored2)
Upvotes: 3