swift 从另一个国家的领域数据库丢失数据

swift Lost data from the realm database in another country

我的应用程序(待办事项列表)使用 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
    }
 
}

这是一个 class 用于使用 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
    }
}

我怀疑这件事在数据库里,但我无法理解它是什么,因为我没有按国家/地区等进行筛选

问题出在日期上,因为日期会根据时区发生变化,如果您在一个时区中选择今天的 date/time,则数据库中的日期会有所不同。所以如果一个过滤器是基于这个日期

@objc dynamic var date : Date?

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

例如如果您创建一个新的 date/time,它将是本时区的今天,但也可能是不同时区的昨天。