【发布时间】:2021-12-26 12:07:34
【问题描述】:
我将realm 数据库用于我的应用程序(待办事项列表),一切正常,但是一旦我飞往另一个国家并注意到数据库中的记录是空的(应用程序给出一个空列表) ,回到我的国家后一切恢复正常......现在我再次在另一个国家,情况再次重复(数据库为空),由于某种原因,数据库给出了一个空列表结果,你能解释一下为什么正在发生,如何解决?
输出示例
var dbToDoList = DBrealmToDoList()
var arrayToDoList: Results<RealmToDoList> {
get {
return dbToDoList.getArray()
}
}
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
dbToDoList.realm = realm
let current = arrayToDoList.filter { (_todo) -> Bool in
return _todo.date == date
}.first
self.selectedDate = date
if current != nil {
self.selectedLists = current?.lists
self.selectedListsSorted = self.selectedLists?.sorted(by: { (val, val2) -> Bool in
return (!val.value && val2.value)
})
}
}
然后在tableView 中显示来自selectedListsSorted 的数据
// MARK: UITableView
extension ToDoListViewController : UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return selectedListsSorted?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ToDoListTableViewCell
let current = selectedListsSorted?[indexPath.row]
cell.nameLabel.text = current?.key
cell.checkBox.isSelected = current?.value ?? false
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 90
}
}
这是一个使用 db 的类
class RealmToDoList: Object {
@objc private dynamic var dictionaryData: Data?
var lists: [String: Bool] {
get {
guard let dictionaryData = dictionaryData else {
return [String: Bool]()
}
do {
let dict = try JSONSerialization.jsonObject(with: dictionaryData, options: []) as? [String: Bool]
return dict!
} catch {
return [String: Bool]()
}
}
set {
do {
let data = try JSONSerialization.data(withJSONObject: newValue, options: [])
dictionaryData = data
} catch {
dictionaryData = nil
}
}
}
@objc dynamic var date : Date?
}
class DBrealmToDoList {
var realm: Realm!
func write(_ data: RealmToDoList) throws -> Bool {
var result = false
if (realm != nil) {
try! realm.write {
realm.add(data)
result = true
}
return result
} else {
throw RuntimeError.NoRealmSet
}
}
func getArray() -> Results<RealmToDoList> {
return realm.objects(RealmToDoList.self)
}
func delete(_ data: RealmToDoList) throws -> Bool {
var result = false
if (realm != nil) {
try! self.realm.write {
self.realm.delete(data)
result = true
}
return result
} else {
throw RuntimeError.NoRealmSet
}
}
func update(ofType:Object,value:AnyObject,key:String)->Bool{
do {
let realm = try Realm()
try realm.write {
ofType.setValue(value, forKeyPath: key)
}
return true
}catch let error as NSError {
fatalError(error.localizedDescription)
}
}
func filter(id:Int) -> RealmToDoList? {
let match = realm.objects(RealmToDoList.self).filter("id == %@",id).first
return match
}
func newToDoList(date : Date?,lists: [String: Bool]) -> RealmToDoList{
let pill = RealmToDoList()
pill.date = date
pill.lists = lists
return pill
}
}
我怀疑这件事在数据库中,但我无法理解它是什么,因为我没有按国家等进行过滤。
【问题讨论】:
-
感谢翻译。我已提名您的问题重新提出,但它可能仍需要一段时间才能获得足够的支持票。
-
这是一个模糊的问题,我对代码按原样工作感到有点惊讶。首先,我们不知道这是本地还是同步的 Realm;如果它是本地的,则所有数据都存储在设备上,并且位置不相关。另外,这个
var realm: Realm!不是Realm 的初始化方式,所以调用这个func getArray()总是会失败,因为Realm 在调用它之前没有被初始化。查看入门指南Opening A Realm 可能会有所帮助。另外,我不相信 Realm 支持 AnyObject,所以func update也不起作用。 -
@Jay 是的,我在
viewDidLoad方法中做了let realm = try! Realm() dbToDoList.realm = realm并且它唯一的本地同步 -
我也很困惑,为什么不同国家的数据库返回空值。
-
除了
func update之外,您的代码中没有它。我在上面关于func update的评论中犯了一个错误——AnyObject 在这种情况下可以工作。但是,问题中的代码仍然不完整,Realm 没有正确初始化。请查看How to create a Minimal, Complete, and Verifiable example。如果我们没有准确的代码,我们将无法提供帮助。