我使用 Realm 作为我的Note-taking-app。 我之前使用过核心数据,现在我正在将核心数据迁移到领域,但是我遇到了麻烦!重新排序这样的对象会导致错误。
do {
let realm = try Realm()
let source = myNote[sour!.row]
try realm.write() {
myNote.remove(objectAtIndex: sourceIndexPath!.row)
myNote.insert(source, at: destensionIndexPath!.row)
}
}
catch {
print("handle error")
}
所以我补充道 orderPosition 属性到我的对象
dynamic var orderPosition: Int = 0
并将 tableView moveRowAtIndexPath 更改为此 ReorderingRealmResultsInTableView.swift
但它没有多大帮助。 那么我如何在领域中重新排序对象?
答案 0 :(得分:4)
我建议您将订购的商品存储在List
中,而不是根据orderPosition
属性进行排序。
在移动项目时手动存储索引的性能要差得多,因为“旧索引”和“新索引”之间的所有对象都需要进行变异以考虑更改。
然后,您可以使用List.move(from:to:)
将对象从一个索引移动到另一个索引,这应该直接对应于您正在重新排序的表视图中的索引。
以下是您可以遵循的教程,指导您构建任务管理应用程序,包括对重新排序任务的支持:https://realm.io/docs/realm-mobile-platform/example-app/cocoa/
答案 1 :(得分:0)
orderPosition: Double
肯定是高效和干净的,但我不确定如何通过服务器同步它。所以在我的情况下,我使用的是orderPosition
,并且该值被计算为插入对象的两个现有try! list.realm?.commitWrite(withoutNotifying: [notificationToken!])
的中间位置。另请注意,您可以在不通知通知的情况下执行写入:data my_data;
input study $ year rr lcl ucl;
datalines;
mickey 2015 1.5 0.7 2.3
minny 2010 1.2 1.0 1.4
donald 2013 0.8 0.2 1.4
daisy 2014 1.3 1.0 1.6
goofy 2017 1.9 0.9 2.9
pluto 2010 1.4 0.7 2.1
;
run;
proc sgplot data=my_data
noautolegend nocycleattrs;
scatter y=study x=rr/ markerattrs=(symbol=squarefilled size=12 color=black);
highlow high=ucl low=lcl y=study / type=line lineattrs=(color=black);
yaxistable study year / labelattrs=(family=arial size=12pt weight=bold) position=left location=inside valueattrs=(family=arial size=10pt);
yaxistable rr lcl ucl / labelattrs=(family=arial size=12pt weight=bold) position=right location=inside valueattrs=(family=arial size=10pt);
xaxis offsetmin=0.1 offsetmax=1 min=0.5 max=3.0 display=(nolabel);
yaxis offsetmin=0.1 offsetmax=0.1 display=none reverse;
refline 1 / axis=x;
styleattrs axisextent=data;
run;
。
答案 2 :(得分:0)
正如其他人所建议的那样,列表是解决方案。这是在Swift 5上实现该方法的示例:
import UIKit
import RealmSwift
// The master list of `Item`s stored in realm
class Items: Object {
@objc dynamic var id: Int = 0
let items = List<Item>()
override static func primaryKey() -> String? {
return "id"
}
}
class Item: Object {
@objc dynamic var id: String = UUID().uuidString
@objc dynamic var name = ""
}
class ViewController: UITableViewController {
let realm = try! Realm()
var items = RealmSwift.List<Item>()
override func viewDidLoad() {
super.viewDidLoad()
// initialize database
var itemsData = realm.object(ofType: Items.self, forPrimaryKey: 0)
if itemsData == nil {
itemsData = try! realm.write { realm.create(Items.self, value: []) }
}
items = itemsData!.items
// temporarily add new items
let newItem1 = Item()
newItem1.name = "Item 1"
let newItem2 = Item()
newItem2.name = "Item 2"
try! realm.write {
items.append(newItem1)
items.append(newItem2)
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
...
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
try! items.realm?.write {
items.move(from: sourceIndexPath.row, to: destinationIndexPath.row)
}
}
}
您可以在examples/
下的GitHub Repo(https://github.com/realm/realm-cocoa)中找到适用于iOS和macOS的示例应用程序,说明如何使用Realm的许多功能,例如迁移,如何与UITableViewControllers一起使用,加密,命令行工具等等。