【问题标题】:swift Lost data from the realm database in another countryswift 从另一个国家的领域数据库中丢失数据
【发布时间】: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。如果我们没有准确的代码,我们将无法提供帮助。

标签: swift realm


【解决方案1】:

问题在于日期,因为日期会根据时区而变化,如果您在一个时区中选择今天的日期/时间,那么数据库中的内容会有所不同。因此,如果过滤器基于此日期

@objc dynamic var date : Date?

那么对于您所在的任何时区,该日期将是“今天”,但今天早上在不同时区创建的“今天”日期不会返回当前时区日期。

例如如果您创建一个新的日期/时间,它将是这个时区的今天,但可能是另一个时区的昨天。

【讨论】:

    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多