(CoreData) MagicalRecord 突然停止持久保存
Posted
技术标签:
【中文标题】(CoreData) MagicalRecord 突然停止持久保存【英文标题】:(CoreData) MagicalRecord suddenly stops saving persistently 【发布时间】:2014-01-01 22:40:03 【问题描述】:我正在开发一个 ios 项目,其中需要从 Internet 下载大量数据并将其保存在数据库中。我使用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);
];
【问题讨论】:
【参考方案1】:经过 3 天的调试和回溯,我终于弄清楚了问题所在。
它与 CoreData 或 MagicalRecord 无关。
我从服务器获取的一个对象有speed = (null)
。这基本上停止了数据库中来自该对象及其他对象的所有条目,而不是仅仅失败并为其余部分工作。这可能是因为我使用的是saveWithBlockAndWait:
而不仅仅是saveWithBlock:
,但我没有足够的经验来肯定地说。
【讨论】:
以上是关于(CoreData) MagicalRecord 突然停止持久保存的主要内容,如果未能解决你的问题,请参考以下文章
(CoreData) MagicalRecord 突然停止持久保存
在 TodayExtension 中使用 MagicalRecord (CoreData)
CoreData(MagicalRecord) 获取保存的对象
MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?