【问题标题】:What is the correct way to catch a write error in Realm using Objective-C?使用 Objective-C 在 Realm 中捕获写入错误的正确方法是什么?
【发布时间】:2016-11-30 02:54:20
【问题描述】:

我们在初始化时将很多项目导入我们的领域数据库客户端。我们正试图弄清楚为什么它在某些客户端计算机上崩溃,但我们不确定“捕获”此错误以记录它的正确方法。我读过写错误不打算被捕获。这是一些简化的代码

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for(NSDictionary* package in packages)
{
     CMPackage *realm_package = [my_type createOrUpdateInDefaultRealmWithValue:package];
}

[realm commitWriteTransaction];

当调用 createOrUpdateInDefaultRealmWithValue 时会发生崩溃,但仅限于某些客户端。我们认为它可能只是在更新之间存在的旧文件,但我们无法弄清楚,因为我们无法捕获它。在中心语句周围放置一个 try/catch 是否安全?当其中一个写入出错时,提交写入事务是否安全?这个问题有好的解决办法吗?

编辑:

我还应该注意,我们希望在一个事务中完成所有操作,并且能够在一次写入失败后继续执行事务,因为如果在单独的转换中完成写入,则会对速度产生负面影响。

【问题讨论】:

  • 遇到什么错误,createOrUpdateInDefaultRealmWithValue 方法有什么作用?
  • @Dmitry - 该方法是一个领域方法:realm.io/docs/objc/latest/api/Classes/RLMObject.html 确切的例外是未知的,因为我们无法重新创建它。跨度>
  • 快速观察一下,当您同时引入一个名为 packageNSDictionary 变量时,在 for 循环中创建一个名为 package 的变量可能不是一个好主意。您可以使用commitWriteTransaction:(NSError *)error 捕获写入错误,但如果createOrUpdateInDefaultRealmWithValue 抛出异常,您需要想出一种方法来捕获异常消息。在尝试将其添加到 Realm 之前,可能值得对 package 进行一些检查以验证其信息是否有效。
  • @TiM - 使用相同的变量名很好的捕获(上面已更正)。那只是将其翻译为张贴的错误。我已经看到了事务错误处理,但这会在我假设的错误时中止整个循环。我们代码中的实际循环比发布的要复杂一些,因此验证会涉及更多。它通过内省遍历许多不同的领域对象类型,这会使检查对象变得很痛苦。并不是说不可能,但是如果有一种方法可以优雅地捕获单个写入异常而不中止事务,那将非常有帮助。
  • @David 不,没有可以使用的“验证”机制。 Realm 只会在对库的错误使用时抛出异常,并且您永远不应该捕获它们,因为这样做对于 ARC Objective-C 代码通常是不安全的。这就是 commitWriteTransaction:(NSError *)error 存在的原因。

标签: ios objective-c database macos realm


【解决方案1】:

根据上述与 Realm 工程师的对话,似乎不支持测试和验证事务中的单个插入,并且只能在每个事务的基础上捕获错误。我会假设,因为这是一个事务,如果发生异常,这将回滚所有其他插入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 2011-12-13
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多