Core data Restkit&x2B;核心数据:在每次应用程序启动时在UITableView中插入重复的值

Core data Restkit&x2B;核心数据:在每次应用程序启动时在UITableView中插入重复的值,core-data,restkit,restkit-0.20,Core Data,Restkit,Restkit 0.20,下面我遇到了下面的行为。我可以按要求提供代码,因为有很多行,我不确定应该在哪里查找。基本上,它“工作”的意思是数据被正确加载到UITableView中,但在停止和启动模拟器后,它会在每个部分插入新的重复行 我想这可能与缓存有关,但我非常仔细地学习了上面的教程,并设置了identificationAttributes来识别唯一的记录(例如,添加所有属性不会有效地消除我没有指定足够唯一的密钥的可能性,只是为了调试目的吗?)。我尝试过更改缓存名称,将其设置为零,但它会不断插入重复项。我经常重置模拟器,

下面我遇到了下面的行为。我可以按要求提供代码,因为有很多行,我不确定应该在哪里查找。基本上,它“工作”的意思是数据被正确加载到UITableView中,但在停止和启动模拟器后,它会在每个部分插入新的重复行

我想这可能与缓存有关,但我非常仔细地学习了上面的教程,并设置了
identificationAttributes
来识别唯一的记录(例如,添加所有属性不会有效地消除我没有指定足够唯一的密钥的可能性,只是为了调试目的吗?)。我尝试过更改缓存名称,将其设置为零,但它会不断插入重复项。我经常重置模拟器,只是为了从头开始

如果有必要,我会根据教程在
viewdiload
中调用
getObjectsAtPath
。我对RestKit工作原理的理解是这样做是可以的,因为这样做可以很聪明地推断不需要更新,因为记录都是一样的

编辑

我已经将
identificationAttributes
设置为一个由两个整数属性组成的数组,它们确实决定了一个唯一的记录

我还有一个
managedObjectCache

//成交
[managedStore createPersistentStoreCoordinator];
NSString*storePath=[RKApplicationDataDirectory()stringByAppendingPathComponent:@“CCTDB.sqlite”];
n错误*错误;
NSPersistentStore*persistentStore=
[管理商店
addSQLitePersistentStoreAtPath:storePath
fromSeedDatabaseAtPath:nil
withConfiguration:nil
选项:@{
NSMigratePersistentStoresAutomaticallyOption:@是,
nsInFermappingModelAutomaticalyOption:@是
}
错误:&错误];
NSAssert(persistentStore,@“无法添加持久存储,错误为:%@”,错误);
[managedStore CreateManagedObjectContext];
managedStore.managedObjectCache=[[RKInMemoryManagedObjectCache alloc]initWithManagedObjectContext:managedStore.persistentStoreManagedObjectContext];
编辑1

这是第二次的日志输出

(2013-07-11 03:18:29.961 cocoaclinical[18773:3d07]D restkit.对象映射:RKPropertyInspector.m:130类“EMDisease”的缓存属性检查:{
疾病ID={
isPrimitive=0;
keyValueCodingClass=NSNumber;
名称=疾病ID;
};
diseaseIdValue={
isPrimitive=1;
keyValueCodingClass=NSNumber;
name=diseaseIdValue;
};
姓名={
isPrimitive=0;
keyValueCodingClass=NSString;
名称=名称;
};
子SEID={
isPrimitive=0;
keyValueCodingClass=NSNumber;
name=subDiseaseId;
};
次级SEIDVALUE={
isPrimitive=1;
keyValueCodingClass=NSNumber;
名称=子SEIDVALUE;
};
}
2013-07-11 03:18:29.975 cocoaclinical[18773:3f03]I restkit.核心数据:RKInMemoryManagedObjectCache.m:94按属性“diseaseId,subseaseId”缓存实体“EMDisease”的实例
2013-07-11 03:18:29.983 cocoaclinical[18773:3f03]T restkit核心数据:RKInMemoryManagedObjectCache.m:127缓存的31个对象
2013-07-11 03:18:29.984 cocoaclinical[18773:3f03]D restkit.对象映射:RKMapperOperation.m:231要求映射源对象{
DiseaseSystemIdMember=161;
DisplayNameMember=“急性淋巴细胞白血病”;
子系统成员=1886;
}带映射
2013-07-11 03:18:29.984 cocoaclinical[18773:3f03]D restkit.对象映射:RKMappingOperation.m:952开始映射操作。。。
2013-07-11 03:18:29.985 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:953执行映射操作:针对“EMDisease”对象.映射对象的值{
DiseaseSystemIdMember=161;
DisplayNameMember=“急性淋巴细胞白血病”;
子系统成员=1886;
}对象(实体:EMDisease;id:0xb5b7f80;数据:{
diseaseId=161;
name=nil;
细分SEID=1886;
})具有对象映射(空)
2013-07-11 03:18:30.027 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:550将属性值keyPath“subdiseaseSystemememember”映射到“subdiseaseMember”
2013-07-11 03:18:30.028 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:583跳过了属性值从keyPath“subseasystememember”到keyPath“subseaseid”的映射--值不变(1886)
2013-07-11 03:18:30.029 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:550将属性值keyPath“DisplayNameMember”映射到“name”
2013-07-11 03:18:30.029 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:572将属性值从keyPath“DisplayNameMember”映射到“name”。值:急性淋巴细胞白血病
2013-07-11 03:18:30.030 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:550将属性值keyPath“DiseaseSystemIdMember”映射到“diseaseId”
2013-07-11 03:18:30.030 cocoaclinical[18773:3f03]T restkit.对象映射:RKMappingOperation.m:583跳过了从keyPath“DiseaseSystemId成员”到keyPath“diseaseId”的属性值映射--值不变(161)
2013-07-11 03:18:30.031 cocoaclinical[18773:3f03]D restkit.对象映射:RKMappingOperation.m:1021成功完成映射操作。。。

您确实需要设置
identificationAttributes
,但通常只有一个或两个属性,而不是所有属性。您的实体应该具有一些唯一的标识符

您还希望向托管对象存储添加一个
managedObjectCache
。这是一个允许RestKit使用您的
IdentificationAttribute
匹配对象并更新现有项而不是创建新项的部分。