上下文:
我正在编写我的第一个应用程序,其中我希望能够在按索引0的按钮上添加新行(请参见下面的代码)。我使用领域数据库存储数据。
问题
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update'.
eventArray
的打印语句时,它始终为零。这使我相信我实际上并没有成功地将数据保存到领域。问题:
为什么数据没有保存到我的领域数据库中?为什么我的tableView不能插入新行?
我已经评论了我的问题发生的地方
class EventsScreen: UIViewController {
let realm = try! Realm()
var eventArray : EventList?
@objc func addEvent() { //The function my add button calls when pressed
let newCell = Event()
print(realm.objects(EventList.self).first)
insertInRealmContainerAtIndexZero(newEvent: newCell)
print(realm.objects(EventList.self).first)
let ndxPath = IndexPath(row: 0, section: 0)
tableView.beginUpdates()
tableView.insertRows(at: [ndxPath], with: .bottom) //App terminates on this line
tableView.endUpdates()
}
override func viewDidLoad() {
super.viewDidLoad()
loadEvents()
setupBackgroundVisuals()
registerCellAndDelegateAndDataSource()
}
private func insertInRealmContainerAtIndexZero(newEvent: Event) { // I suspect this method is the problem since when I restart the app the tableview doesn't load up any new created events.
if eventArray?.events != nil {
do {
try realm.write {
eventArray?.events.insert(newEvent, at: 0)
}
} catch {
print(error)
}
} else {
do {
try realm.write {
realm.add(newEvent)
}
} catch {
print(error)
}
}
}
private func loadEvents() {
eventArray = realm.objects(EventList.self).first
tableView.beginUpdates()
tableView.endUpdates()
}
}
数据对象:
class Event: Object {
@objc dynamic var eventTitle: String?
@objc dynamic var eventText: String?
}
class EventList: Object {
let events = List<Event>()
}
感谢您阅读我的帖子。
答案 0 :(得分:0)
第一次在此行启动应用程序
eventArray = realm.objects(EventList.self).first
返回nil并在运行时返回
if eventArray?.events != nil {
当eventArray
为nil时进行其他操作,否则进行
realm.add(newEvent)
尽管您应该
eventArray = EventList()
eventArray.events.append(newEvent)
然后添加
realm.add(eventArray)