Swift:在插入新行时,将“ List”对象保存到领域数据库中并随后更新tableView时出现问题

时间:2018-08-06 08:47:31

标签: ios swift uitableview realm

简介

上下文:

我正在编写我的第一个应用程序,其中我希望能够在按索引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'.
  • 同样,当我检查tableView数据数组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>()
}

感谢您阅读我的帖子。

1 个答案:

答案 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)