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