我尝试了几个核心数据的例子。所以我现在所拥有的,我能够将数据保存到我的cstore中,也能够检索它。我的问题是这样的,我从服务器获取数据并存储它。下次当我从服务器获取数据时,我只想保存新数据。
保存数据和获取数据的方法如下:
-(NSArray *)getUserListFromDB {
NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Subscribers" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entitydesc];
NSError *error;
NSArray *channelData = [context executeFetchRequest:request error:&error];
return channelData;
}
-(void)saveUserslListToDB:(SubscriberChannelListDataModel *) subscriberChannelList {
NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Subscribers" inManagedObjectContext:context];
NSMutableArray *user = subscriberList;
for(int position = 0; position < channelList.count; position ++) {
NSManagedObject *newUser = [[NSManagedObject alloc] initWithEntity:entitydesc insertIntoManagedObjectContext:context];
UserDataModel *userData = [user objectAtIndex:position];
[newUser setValue: userData.userName forKeyPath:@"userName”];
[newUser setValue: userData.userId forKeyPath:@“userId”];
NSError *error;
[context save:&error];
NSLog(@"Data save ..");
}
}
有没有人遇到过同样的问题并有好的解决办法?
你的目标可以通过不同的方式实现,这取决于你需要付出多少努力以及你的数据有多大。大I的意思是你是否有很多数据。
起点是为您的实体使用guid
属性。此属性用于查看某个项目是否已经出现在商店中。实现它的正确方法是遵循执行查找或创建高效章节。
关于解决方案,一个简单的方法是从服务器获取所有数据,并更新已经在存储中的对象(具有所有属性),并插入不在存储中的其他对象。这可能适用于小数据集。无论如何,您应该使用Instruments测试性能。
更复杂的方法是与guid
属性一起使用updateAt
时间戳(NSDate
类型)。看看如何同步iPhone核心数据与web服务器,然后推送到其他设备?特别是第二个答案为你的目标提供了一个伪算法。
。我猜你需要在后台执行操作,以便不阻塞UI。
这是我最近做的一个项目的代码示例。我在这里使用Magical Record进行搜索,但我认为你们会通过这个了解你能做什么,它还处理检查,看看对象是否有不同的updatedAt时间戳。
Package *package = [Package MR_findFirstByAttribute:@"id" withValue:[packageDict[@"id"] stringValue]];
NSDate *updatedAt = [dateFormatter dateFromString:packageDict[@"updated_at"]];
if (!package) {
// Object doesn't exist yet, create it
package = [Package MR_createEntity];
package.id = [packageDict[@"id"] stringValue];
}
if (![package.updated_at isEqualToDate:updatedAt]) {
// Object has been updated, assign values
}
思路如下:
- 尝试从核心数据中获取对象。
- 如果它不存在,创建它并给它一个id。
- 如果对象是新的或已经更新,赋值,否则循环到下一个。