【问题标题】:Object has been deleted or invalidated. (Realm)对象已被删除或失效。 (领域)
【发布时间】:2016-05-26 11:00:48
【问题描述】:

请参考Error: Object has been deleted or invalidated. (Realm) 我在这两种情况下也遇到了这个错误。 我尝试在删除之前找到 DBProduct,但它也得到了错误:对象已被删除或无效。这是错的吗?请帮我。我在警报视图块中将此方法称为案例 2。

let realm = try! Realm()
try! realm.write {
    let dbProduct = realm.objectForPrimaryKey(DBProduct.self, key: product.id)
    if dbProduct != nil {
        realm.delete(dbProduct!)
    }
}

更新:此问题仅在 iOS8 上出现,在 iOS 9 上正常。

【问题讨论】:

  • 我认为你的逻辑是错误的。您正在尝试从 Realm 中删除一个已经从 Realm 中删除的对象,但您仍然有一个 POSO 引用它。没有看到你所有的代码,我猜那个对象是product
  • 我重新加载表格视图并删除 Realm 的数据。但它仅在 iOS8 上发生,在 iOS 9 上正常。我不知道问题所在。

标签: swift realm


【解决方案1】:

通常,只有当您尝试访问已删除的 Realm 对象的属性,或者您明确告知其父 Realm 对象无效时,才会引发该错误。

就像 James 说的那样,你的 product 变量很可能已经失效,在这种情况下尝试调用 product.id 可能会导致崩溃。

如果是这种情况,那么解决此问题的最简单方法是避免使用product 变量,而是直接复制id 的值。这样,如果对象被删除/失效,您仍然拥有它的主键,您可以在其中测试它是否仍然存在。

顺便说一句,这段代码当然也可以变得更有效率。不必在写事务中执行查询,只有在确实有要删除的对象时才应该打开写事务(写事务是相当繁重的事情,因此应尽可能避免)。

let productID = product.id //save a copy of the ID in case 'product' gets deleted.

let realm = try! Realm()

let dbProduct = realm.objectForPrimaryKey(DBProduct.self, key: productID)
if dbProduct != nil {
    try! realm.write {
        realm.delete(dbProduct!)
    }
}

希望对你有所帮助!

【讨论】:

  • 我在iOS 9上测试过,没问题。但是,iOS 8 上的应用程序崩溃。
  • 崩溃错误:对象已被删除或失效。
  • 等一下。您是否按照我的建议操作并停止在查询中使用 product.id?我意识到我没有在我的代码示例中说清楚,所以我只是更新了它。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多