Restkit 在设备上产生重复项(错误:“托管对象缓存返回 2 个对象”),但在模拟器中没有产生。

3
我在我的设备上收到警告“restkit.core_data:RKManagedObjectMappingOperationDataSource.m:264管理对象缓存返回了2个与'MyEntity'实体配置的标识符相同的对象,预期为1个”,但模拟器上从未出现过。
模拟器中的sqlite数据库没问题,但是在设备上有相同的重复条目。如果我删除数据库,则警告会在一段时间后再次弹出,但仅在设备上发生。
我使用Restkit 0.23.1将JSON数据导入核心数据,并删除孤立的对象。设置了 identificationAttributes。
是否有任何想法,是否有模拟器和设备之间可能导致此问题的差异?
感谢您的帮助。
编辑:
我对各种实体都出现错误。这是我对实体ResellerType的映射(每个实体只有一个映射):
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"ResellerType"
                                               inManagedObjectStore:[YPIDataProvider sharedDataProvider].objectManager.managedObjectStore];
[mapping addAttributeMappingsFromArray:@[ @"resellerTypeId",
                                          @"resellerTypeName",
                                          @"position" ]];
mapping.identificationAttributes = @[ @"resellerTypeId" ];

我与Reseller表有一个一对多的关系,与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([[NSURLCache sharedURLCache] removeAllCachedResponses])。你能发现这里有什么问题吗?

感谢阅读!


不应该有这种情况。它们总是相同类型的对象吗?你注意到了什么模式?有哪些映射关联?对于同一实体的所有映射,是否都具有相同的标识属性? - Wain
你是否正确定义了主键?例如:[_mapping setIdentificationAttributes:@[ @"objectId" ]]; 其中 objectId 是核心数据对象的主键。 - electronix384128
我更新了我的问题并添加了更多细节。 - Ralf Hundewadt
1个回答

1
我在RestKit的问题#1613中找到了答案:https://github.com/RestKit/RestKit/issues/1613。如果发生内存警告,RestKit会清除缓存。如果正在进行映射操作,则之后可能会有重复数据。
我在RKEntityByAttributeCache.m的didReceiveMemoryWarning中删除了[self flush:nil];,问题就消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接