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

时间:2014-05-07 06:20:11

标签: ios objective-c 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 ..");
    }
}

有没有人遇到过同样的问题而且有很好的解决方案?

2 个答案:

答案 0 :(得分:1)

您的目标可以通过不同的方式实现。这取决于您需要投入多少努力以及您的数据“大”。如果你有很多数据,我意味着很大。

起点是为您的实体使用guid属性。此属性用于查看某个商品是否存在于商店中。实现目标的正确方法是遵循Implementing Find-or-Create Efficiently部分。

关于解决方案,一种简单的方法是从服务器获取所有数据并更新已存储在商店中的对象(包含所有属性)并插入其他不存在的对象。这可能适用于小型数据集。 无论如何,你应该用乐器测试表演

更复杂的方法是与guid属性一起使用updateAt时间戳(类型NSDate)。看看How to Sync iPhone Core Data with web server, and then push to other devices?。特别是第二个答案为您的目标提供了伪算法。

请注意。我想你需要在后台执行操作才能阻止UI。

答案 1 :(得分:0)

这是我最近一个项目的代码示例。我在这里使用魔法记录进行搜索,但我认为你会通过查看这个来了解你可以做什么,它还会处理检查对象是否有不同的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. 尝试从Core Data中获取对象。
  2. 如果它不存在,请创建它并给它一个id。
  3. 如果对象是新的或已更新,请为其分配值,如果不是循环到下一个。