无法在Swift代码中保存,访问和修改Realm数据库中的“List”

时间:2016-10-17 11:48:55

标签: arrays database swift realm

我正在尝试构建一个应用程序,用户可以在集合视图中的任何项目中添加注释。我想在用户添加注释时更新Realm数据库中的列表。

我使用的是Realm数据库版本“realm-swift-0.98.4”,这是可以与Swift 2.1.1一起使用的最新版本 使用这样一个旧版本的Realm,因为我不想在阅读很多关于它们的负面评论后更新到Xcode 8和Swift 3。 我对Swift有一些经验,对Realm来说是全新的。

以下是我的数据模型:

import Foundation
import RealmSwift
import Realm

class ItemEntry: Object {
    dynamic var title = ""
    dynamic var counts = 0
    let noteAndTimeEntryList = List<noteAndTimeEntryObj>()

    convenience init(title: String) {
        self.init()
        self.title = title
    }
}

class noteAndTimeEntryObj: Object {
    dynamic var timeStampOfNote: NSDate?
    dynamic var note: String? = ""
}

以下是显示项目并向其添加注释的代码:

import UIKit
import RealmSwift
import Realm

var ItemsList = [ItemEntry(title: "A"),ItemEntry(title: "B"),ItemEntry(title: "C"),ItemEntry(title: "D")]

override func viewDidLoad() {
    super.viewDidLoad()
    let realm = try! Realm()
    try! realm.write {
        realm.add(ItemsList)
    }
    saveButton.addTarget(self, action: "saveNoteButtonTapped:", forControlEvents: UIControlEvents.TouchUpInside)

    …
    …
}

显示项目:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath      indexPath:NSIndexPath)->UICollectionViewCell {
    var  cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ItemCollectionViewCell
    cell.titleLabel.text = ItemsList[indexPath.row].title
    return cell
}

保存笔记:

func saveNoteButtonTapped(sender: UIButton) {
    guard let selectedCellRow = rowOfLongPressedItem else {
        return // rowOfLongPressedItem was nil
    }

    let realm2 = try! Realm()
    let ItemsListTemp = realm2.objects(ItemsList)

    var selectedItem = ItemsList[selectedCellRow]
    selectedItem.counts += 1
    var latest = selectedItem.counts - 1

    let noteTimePair = noteAndTimeEntryObj()

    noteTimePair.timeStampOfNote = NSDate()
    noteTimePair.note = noteTextField.text

    selectedItem.noteAndTimeEntryList.append(noteTimePair)

    ItemsList[selectedCellRow] = selectedItem

    let realm3 = try! Realm()

    realm3.beginWrite()
    ItemsList.append(selectedItem)
    do {
        try realm3.commitWrite()
    } catch let error {
        // Handling write error,
        // e.g. Delete the Realm file, etc.
        print("UNABLE to append 'selectedItem' to Itemslist")
    }

    notePopup.hidden = true
    notePopup.endEditing(true)
    noteTextField.text = ""
}

在下面的行中,我收到错误“无法将类型'[ItemEntry]'的值转换为预期的参数类型'Object.Type'”

let realm2 = try! Realm()
let ItemsListTemp = realm2.objects(ItemsList)

之前我没有这两行代码。我添加了它们,因为我在执行代码时遇到此错误并尝试保存注释: “由于未捕获的异常'RLMException'终止应用程序,原因是:'尝试修改写事务之外的对象 - 首先在RLMRealm实例上调用beginWriteTransaction。'”

有人可以帮助我...... 请将正确的代码发布到

1 个答案:

答案 0 :(得分:1)

不确定你要做什么。

首先,将一个ItemsList对象添加到noteAndTimeEntryObj

<div id="main" class="container">
  <div class="child" data-search="first" data-get-search="first"><span>first</span></div> 
  <div class="child" data-search="second" data-get-search="first"><span>second</span></div>
  <div class="child" data-search="third" data-get-search="first"><span>third</span></div>
  <div class="child" data-search="fourth" data-get-search="first"><span>fourth</span></div>
  <div class="child" data-search="fifth" data-get-search="first"><span data-search="fifth">fifth</span></div>
</div>

然后,将noteAndTimeEntryList更改为

class noteAndTimeEntryObj: Object {
   dynamic var timeStampOfNote: NSDate?
   dynamic var note: String? = ""
   dynamic var itemsList = ItemsList()
}

这将使其自动更新。

然后,在创建新的notAndTimeEntry

时添加ItemsList对象
let noteAndTimeEntryList = LinkingObjects(fromType: noteAndTimeEntryObj.self, property: "itemsList")

摆脱 let noteTimePair = noteAndTimeEntryObj() noteTimePair.timeStampOfNote = NSDate() noteTimePair.note = noteTextField.text notTimePare.itemsList = ItemsListTemp

然后保存你的noteTimePair。我认为你的功能应该是这样的:


   selectedItem.noteAndTimeEntryList.append(noteTimePair)