在后台线程中将核心数据从一个数据库复制到另一个数据库

Posted

技术标签:

【中文标题】在后台线程中将核心数据从一个数据库复制到另一个数据库【英文标题】:Core Data copy from one db to another in background thread 【发布时间】:2016-06-21 07:19:35 【问题描述】:

我有两个数据库文件,我可以轻松地将核心数据从一个上下文复制到另一个 - 如果我将两个上下文都放在主线程中 (NSMainQueueConcurrencyType)。 但是,如果我希望它在每个数据库文件的上下文为NSPrivateQueueConcurrencyType 的后台线程中异步发生,我该怎么做?请记住:两种上下文都有不同的持久存储协调器! (PS:由于 NSConfinementConcurrencyTypeios 9 中已被弃用,所以限制类型对我来说是不可能的。)

【问题讨论】:

您是在复制商店中的所有内容,还是仅复制其中的一部分? @pbasdf:只有一个子集。 能否使用单个上下文和 PSC(如果两个模型不同,则合并),添加两个商店(必要时使用配置),然后使用 affectedStores 从其中一个和 @987654325 获取@ 插入另一个。只是一个想法;自己从未尝试过。 @pbasdf:谢谢。我不知道你可以有多个 sqlite db 持久化器并且有类似affectedStores 的东西。我什至有一个优势,我只从源数据库中读取,所以我不需要 allocateObject:。如果只有一个可写,CoreData 足够聪明,可以写入正确的数据库。唯一重要的事情:由于目标数据库源自源数据库,我必须重新生成源数据库的元数据 uuid(之前使用单独的 NSPersistentStoreCoordinator 在写入模式下打开一次,关闭它并以只读方式重新打开),否则它会崩溃with, like: 不能两次添加同一个商店。 @pbasdf:如果您将第二条评论重新发布为答案,我可以将其标记为已接受的答案。 PS:我发现:要更改元数据,不需要读/写打开,只读也可以。 【参考方案1】:

您可以使用单个上下文和 PSC(如果两个模型不同,则合并它们)。添加两个存储(如果需要,使用配置),然后使用affectedStores 从其中一个获取,allocateObject:toPersistentStore: 在另一个上插入。如果一个 store 以只读方式打开,那么你就不需要使用allocateObject:,Core-Data 会推断出正确的 store 来使用。

【讨论】:

以上是关于在后台线程中将核心数据从一个数据库复制到另一个数据库的主要内容,如果未能解决你的问题,请参考以下文章

在android中将数据从一个文件复制到另一个文件非常慢?

在 Postgres 中将表从一个数据库复制到另一个数据库

如何使用复制命令在 postgres 中将数据从一个表复制到另一个表

在php中将存储过程从一个数据库复制到另一个数据库

在 SQL Server 中将表从一个数据库复制到另一个数据库

如何在同一个表中将数据从一列复制到另一列?