将数据插入Core data并检查它是否已经存在



我尝试了几个核心数据的例子。所以我现在所拥有的,我能够将数据保存到我的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
}

思路如下:

  1. 尝试从核心数据中获取对象。
  2. 如果它不存在,创建它并给它一个id。
  3. 如果对象是新的或已经更新,赋值,否则循环到下一个。

最新更新