ios - (CoreData) MagicalRecord 突然停止持久保存

标签 ios objective-c magicalrecord

我正在处理一个 iOS 项目,其中需要从互联网下载大量数据并将其保存在数据库中。我正在使用 MagicalRecord处理 CoreData。

它在一段时间内效果很好。然后,当 sqlite 数据库达到 3.6-4.0 MB 左右时,它突然停止保存信息。那是在同一次运行中,没有明显的原因。控制台打印继续进行,就好像没有问题一样。

总的来说,我是 MagicalRecord 和 CoreData 的新手。不确定是什么问题。谢谢

这是负责收集的代码:

+ (void)downloadObjects {
    NSString *urlString = [NSString stringWithFormat:@"http://url.to.backend/server?with=parameters"];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        // Parse the XML into a dictionary
        NSError *parseError = nil;
        NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLParser:(NSXMLParser *)responseObject error:&parseError];
        __block NSArray *objectsArray = xmlDictionary[@"list"][@"object"];

        [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
            NSLog(@"PROCESSING: %d objects", [objectsArray count]);

            if (objectsArray.count) {
                for (NSDictionary *object in objectsArray) {
                    long long objectID = [object[@"objectid"] longLongValue];
                    __block NSString *latitude = object[@"latitude"];
                    __block NSString *longitude = object[@"longitude"];
                    __block NSString *speed = object[@"speed"];
                    __block NSString *distance = object[@"distance"];
                    __block NSDate *time = object[@"time"];

                    [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
                        if (time) { //Check if valid object
                            Object *existingObject = [ObjectManager objectWithID:objectID];
                            if (!existingObject) { //Check if existing object
                                if (DEBUG_DATA_COLLECTION) NSLog(@"%lld: NEW OBJECT", objectID);

                                Object *anObject = [Object MR_createEntity];

                                anObject.time = time;
                                anObject.objectID = @(objectID);
                                if (distance) anObject.distance = @([distance floatValue]);
                                if (latitude) anObject.latitude = @([latitude floatValue]);
                                if (longitude) anObject.longitude = @([longitude floatValue]);
                                if (speed) anObject.speed = @([speed floatValue]);

                            }
                            else {
                                if (DEBUG_DATA_COLLECTION) NSLog(@"%lld: EXISTING OBJECT", objectID);
                            }
                        }
                    }];
                }
            }

            [ObjectManager aggregatePerDay];
            [ObjectManager aggregatePerMonth];
        } completion:^(BOOL success, NSError *error) {
            NSLog(@"COMPLETED: %d objects", [objectsArray count]);
            NSLog(@"---------------------");
        }];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

最佳答案

经过三天的调试和回溯我的步骤,我终于弄清楚了问题所在。

它与 CoreData 或 MagicalRecord 无关。

我从服务器获取的对象之一具有speed = (null)。这基本上停止了数据库中该对象及其他对象的所有条目,而不是仅仅失败并为其余对象工作。这可能是因为我使用的是 saveWithBlockAndWait: 而不仅仅是 saveWithBlock: 但我没有足够的经验来确定。

关于ios - (CoreData) MagicalRecord 突然停止持久保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874049/

相关文章:

ios - 如何知道一个对象是子类还是父类(super class)的实例

ios - 如果我使用 unwindSegue 从屏幕 A 转到 B 再回到 B,如何返回到我的主显示器 (A)

iphone - 使用 NSIncation 在主线程上执行选择器

iOS 检测用户是否在 iPad 上

ios - MagicalRecord - 检索最后插入的记录 ID

objective-c - ios sdk 一次只能更改一个 View 的错误

ios - UICollectionView 功能问题

ios - 十进制转二进制的方法Objective-C

ios - 核心数据(魔术记录)在提取时暂停主线程

ios - Magical Record 级联删除(truncate All)不删除