- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在实现一个自定义 NSIncrementalStore 子类,它使用关系数据库进行持久存储。我仍然挣扎的事情之一是对乐观锁定的支持。
(请随意跳过下面对我的问题的冗长描述)
我通过检查 Core Data 的 SQLite 增量存储生成的 SQL 日志来分析它是如何解决这个问题的,并得出以下结论:
UPDATE ZFOO SET Z_OPT=Y, (...) WHERE (...) AND Z_OPT=X
DELETE FROM ZFOO WHERE (...) AND Z_OPT=X
最佳答案
我意识到这不是您问题的答案,但我会尝试向您提供我对 CoreData 和与数据库相关性的看法:
(一级缓存)
NSPesistentStoreCoordinator + NSPersistentStore == 一个数据库连接
(二级缓存)
NSManagedObjectContext == 缓存在保存更改的连接上
因此,据我所知,您的问题是您与商店有多个连接,每个连接都进行更改,但您没有对记录的中央版本控制。
您的商店将收到 -executeRequest:withContext:error:
与 NSSaveRequestType
然后,您将负责验证记录版本是否匹配,如果您发现连接级别(级别 1)中存在冲突,则报告上下文(级别 2)和协调器之间的版本不匹配。
您需要报告您的连接(级别 1)和您的商店之间的版本不匹配。
为了能够做到这一点,您的商店必须报告所有与它的连接 (ConnectionManager) 上的更改,或者它可能会提供对其执行的更改的 Hook 。
我不是 SQLite 专家,但 SQLite API 确实在该领域提供了一些东西:
update hook
commit hook
changes
total changes
(我没有设置这些类型的钩子(Hook)的经验,但如果 CoreData 使用它们,它不会显示在调试日志中)
您可以通过设置错误指针 (NSError**) 并将其内部数据设置为与 CoreData 协调器正在设置的数据相匹配来报告这些错误(创建合并冲突并根据需要设置其中的信息)
注意乐观锁失败只会在-executeRequest:withContext:error:
期间发生
(除非您与商店有流氓连接,经理未跟踪的连接。
为了支持这种行为,您的经理可能需要验证每条记录,因为它被提交以节省 [巨大的性能成本],或者使用一些 Hook 到最近对记录所做的更改
)
要处理到您的商店的多个连接,您可能需要拥有 NSIncrementalStoreNode 的共享缓存,由商店 url 键控:
静止的 @{
url1 : 实际缓存映射 1,
url2 : 实际缓存映射2,
...
}
保存到商店的每个连接将再次验证商店 url 实际缓存。
希望这对你有意义。
关于ios - NSIncrementalStore 子类中的乐观锁定支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821652/
我已经阅读了几篇关于 NSIncrementalStore 的文章,但我仍然对整个概念感到困惑。在这个post我们可以读到: Essentially you can now create a cust
我正在实现一个自定义 NSIncrementalStore 子类,它使用关系数据库进行持久存储。我仍然挣扎的事情之一是对乐观锁定的支持。 (请随意跳过下面对我的问题的冗长描述) 我通过检查 Core
我一直在研究使用核心数据与 Web 服务交互的最佳方式,因此我看到 NSIncrementalStore 突然出现。 看完an article by Drew Crawford , a program
我是一名优秀的程序员,十分优秀!