高效更新大量核心数据记录

Posted

技术标签:

【中文标题】高效更新大量核心数据记录【英文标题】:Efficiently updating large amount of core-data records 【发布时间】:2013-07-30 03:09:28 【问题描述】:

从服务器获取用户 uid 列表后,我需要更新大量具有相同值的用户对象。服务器返回一个用户 ID 数组,如下所示:


    "ids": [1, 2, 3, 4]

这里可以有 100+ 个 id(本地用户表包含 2k+ 条记录),所以我正在寻找尽可能有效的方法。首先,我需要将已经存在的 isOpened 值设置为 0。在 SQL 术语中,我需要执行以下操作:

UPDATE users SET isClosed = 0 WHERE isClosed = 1

UPDATE users SET isClosed = 1 WHERE userId IN (1, 2, 3, 4)

基本上我是在解决用户长时间未使用该应用程序时,大规模更新isClosed属性的问题。

现在,对于服务器获取和“映射”部分的问题。如果不将响应映射到对象,我无法弄清楚如何执行正确的 restkit 请求......请告知是否有更合适的方法来执行此操作......所以我正在做一个基本的 restkit/afnetworking 获取请求:

[[[RKObjectManager sharedManager] HTTPClient] getPath:[NSString stringWithFormat:@"/api/%@/closeUsers", [[MyCredentialStore sharedInstance] userId]]
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) 

NSArray *userIDs = [responseObject objectForKey:@"ids"];
    NSLog(@"%@", userIDs);
    // 1. set the default value for isClosed (0) for all users
    // 2. update the users with userIDs to isClosed = 1

failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    // response code is in operation.response.statusCode
];

现在我该如何在成功块中执行 1. 和 2.?还是有像这样进行批量更新的适当的 restkit 方式?

【问题讨论】:

【参考方案1】:

以你指出的数据量,只要一个简单的循环就非常有效。

NSArray *closedUsers = [allUsers filteredArrayUsingPredicate:
        [NSPredicate predicateWithFormat:@"isClosed = %@", @1]];
NSArray *usersFromServer = [allUsers filteredArrayUsingPredicate:
        [NSPredicate predicateWithFormat:@"userID IN %@", userIDs];

for (User *user in closedUsers) 
   user.isClosed = @0; 

for (User *user in usersFromServer) 
   user.isClosed = @1;

您可以对此进行测试 - 使用纯 Core Data 应该需要一瞬间。

【讨论】:

像魅力一样工作。而且速度非常快。不知道为什么我担心性能。

以上是关于高效更新大量核心数据记录的主要内容,如果未能解决你的问题,请参考以下文章

大量记录之间的高效关联计算

在 iOS 中高效存储大量数据

排行榜的高效数据结构,即记录列表(名称、点数) - 高效搜索(名称)、搜索(排名)和更新(点数)

使用两个持久存储协调器进行高效后台更新的陷阱

如何在 Spring Boot 中以内存高效的方式迭代 MySQL 中的大量记录

Mysql高效插入/更新数据