我正在尝试构建一个应用程序,用户可以在集合视图中的任何项目中添加注释。我想在用户添加注释时更新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。'”
有人可以帮助我...... 请将正确的代码发布到
答案 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)