我收到警告" restkit.core_data:RKManagedObjectMappingOperationDataSource.m:264托管对象缓存返回了2个对象,这些对象是为' MyEntity'实体,预期1。"只在我的设备上,但从不在模拟器中。
模拟器中的sqlite数据库很好,但在设备上我有相同的重复条目。如果我删除数据库,一段时间后会再次弹出警告。但只能在设备上使用。
我使用Restkit 0.23.1将JSON数据导入核心数据并删除孤立对象。 identifyAttributes已设置。
如果模拟器和设备之间存在可能导致此问题的差异,是否有任何想法?
感谢您的帮助。
修改
我收到各种实体的错误。这是我对实体ResellerType
的映射(我每个实体只有一个映射):
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"ResellerType"
inManagedObjectStore:[YPIDataProvider sharedDataProvider].objectManager.managedObjectStore];
[mapping addAttributeMappingsFromArray:@[ @"resellerTypeId",
@"resellerTypeName",
@"position" ]];
mapping.identificationAttributes = @[ @"resellerTypeId" ];
我与To Many
表格有Reseller
的关系,与我的Many To Many
表格有MetaData
的关系。
这是我的RestKit设置:
NSError *error = nil;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:kDataModelName withExtension:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
self.managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
[self.managedObjectStore createPersistentStoreCoordinator];
[self.managedObjectStore
addSQLitePersistentStoreAtPath:self.pathToDatabase
fromSeedDatabaseAtPath:nil
withConfiguration:nil
options:@{ NSInferMappingModelAutomaticallyOption: @YES,
NSMigratePersistentStoresAutomaticallyOption: @YES }
error:&error];
[self.managedObjectStore createManagedObjectContexts];
// managedObjectCache: Configure a managed object cache to ensure we do not create duplicate objects:
NSManagedObjectContext *moc = self.managedObjectStore.persistentStoreManagedObjectContext;
self.managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc]
initWithManagedObjectContext:moc];
我在向服务器发送请求([[NSURLCache sharedURLCache] removeAllCachedResponses]
)之前删除了NSURLCache。你能在这里发现什么问题吗?
感谢您阅读所有这些内容!
答案 0 :(得分:1)
我在问题#1613中找到了RestKit的答案:https://github.com/RestKit/RestKit/issues/1613 如果发生内存警告,RestKit会刷新缓存。如果正在进行映射操作,则之后可能会出现重复数据。
我在 RKEntityByAttributeCache.m 中的didReceiveMemoryWarning中删除了[self flush:nil];
,问题就消失了。