我正在一个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:
,但是我没有足够的经验可以肯定地说。