【问题标题】:How to delete on a line in a list with Realm如何使用 Realm 删除列表中的一行
【发布时间】:2020-12-19 08:21:18
【问题描述】:

我有一个 List 结构,它删除了带有 ondelete 的行,但是在返回结果时,该行被删除但显示错误。

我认为问题在于结果没有正确更新。

我应该添加什么代码来更新列表?

List{
        ForEach(datosRealm.aquaris, id: \.self) { item in
            Text(item.nombre)
        }.onDelete { (indexSet) in
            let aqua = datosRealm.aquaris[indexSet.first!]
            let realm = try! Realm()
            try! realm.write{
                realm.delete(aqua)
            }
        }
    }


import SwiftUI
import RealmSwift
 
final class DadesRealm: ObservableObject {
    @Published var aquaris: [Aquaris]
    private var cargaToken: NotificationToken?
    
    
    init() {
        let realm = try! Realm()
        aquaris = Array(realm.objects(Aquaris.self))
        recargarDatos()
    }
    
    private func recargarDatos() {
        let realm = try! Realm()
        let personas = realm.objects(Aquaris.self)
        cargaToken = personas.observe { _ in
            
            self.aquaris = Array(personas)
        }
    }
    
    deinit {
        cargaToken?.invalidate()
    }
}


class Aquaris: Object {
    @objc dynamic var nombre = ""
    @objc dynamic var litros = ""
    @objc dynamic var tipoAcuario = ""
    @objc dynamic var data : Date = Date()
    
    @objc dynamic var id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "id"
    }
    
    let mascota = List<Controls>()
}

错误

libc++abi.dylib:以未捕获的类型异常终止 异常 *** 由于未捕获的异常“RLMException”而终止应用程序,原因:“对象已被删除或无效。”以未捕获的方式终止 NSException 类型的异常

【问题讨论】:

  • 假设您告诉编译器列出一个包含 n 个项目的数组。同时,您告诉编译器删除其中一个。您现在有 n-1 个项目。所以应用程序崩溃了。
  • 这里没有足够的信息。如果您将 View 属性共享为领域对象定义(无论 datosRealm 和 datosRealm.aquaris 是什么),这将有所帮助

标签: swiftui realm updates


【解决方案1】:

问题是获取实时更新的 Realm 结果对象并将其转换为数组,使这些对象成为非实时更新(静态)

换句话说,领域结果对象始终反映该数据的当前状态;如果从领域中删除了一个对象,领域结果对象也将删除该对象。同样,如果添加了一个对象,那么结果对象将反映该添加。 (注意这适用于适合的对象,但结果对象是精心制作的;过滤、排序等)

问题来了

final class DadesRealm: ObservableObject {
    @Published var aquaris: [Aquaris]
    private var cargaToken: NotificationToken?
    
    
    init() {
        let realm = try! Realm()
        aquaris = Array(realm.objects(Aquaris.self))  <- PROBLEM IS HERE

所以你需要做两件事之一

1 - 将 aquaris 设为领域结果对象

@Published var aquaris: Results<Aquaris>? = nil

然后

aquaris = realm.objects(Aquaris.self)

2 - 如果您必须将其用作数组,则当从 Realm 中删除对象时,您还需要将其从数组中删除以保持它们“同步”

我建议使用建议 1,因为从长远来看它会让事情变得更容易。

【讨论】:

  • @MiquelMolina 您指的是哪种同步。同步到 MongoDB 领域服务器或其他什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2016-07-30
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多