如何在应用程序启动之前在 coredata ENTITY 中拥有现有数据

how to have existing data in coredata ENTITY before the app launches

在我的 iOS 应用程序中 - 我有一个叫做 settings 的东西,我在其中设置了 X 、 Y 、 Z 的优先级;例如:X = 30, Y = 60 , Z = 80.

第一次有一些默认值(X=50,Y=50和Z=50),你直到用户将其更改 为所需值。

基本上用户可以更改优先级 N 次,每当他更改时,我只需要 用更改后的值更新默认值

我需要的是保存更改的值,这样当他下次登录时他应该看到他的更改的值而不是默认值.

NSUserDefaults 将是执行此操作的更好位置。您可以使用 registerDefaults: 注册您希望在初始启动时可用的默认值。如果用户什么都不做,您将拥有您注册的可用值。如果用户使用您注册的其中一个键更改值,那么将检索这些新值而不是默认值。

CoreData 不提供任何工具来在设置数据库时创建默认元组。因此,为了让用户看到一些默认值,他可以在将来更改状态并在他登录时看到所需的更改值 - 他需要创建其中包含默认值的数据库元组。 这可以通过使用 NSPredicate 检查元组中是否有条目然后在结果计数为 0 时创建它来完成。 下面我检查 X 是否存在于我的数据库中,否则我创建所有默认元组,因为有一个检查,它在整个应用程序生命周期中只会被调用一次。

-(void) viewDidAppear:(BOOL)animated
{
    //fetch priority levels
    [self setDefaultPriorityLevel];

}

-(void)setDefaultPriorityLevel{
    //Do the database setup to default values if the user is logged in first time
    AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext * context = [appDelegate managedObjectContext];
    NSEntityDescription * entityDesc = [NSEntityDescription entityForName:@"ENTITY_NAME" inManagedObjectContext:context];

    NSFetchRequest * requestDefault = [[NSFetchRequest alloc]init];
    [requestDefault setEntity:entityDesc];

    //just check with anyone no need to check with each relation name
    NSPredicate * predDefault = [NSPredicate predicateWithFormat:@"(relation_name = %@)",@"X"];
    [requestDefault setPredicate:predDefault];

    NSError *error;
    NSArray *objectsForDefault = [context executeFetchRequest:requestDefault error:&error];

    if ([objectsForDefault count] == 0) {
        //no matches create and add the three objects - X, Y, Z (default tuples)
        NSLog(@"No Matches");
        //insert X level
        NSManagedObject *defaultFamilyLevel;
        defaultFamilyLevel = [NSEntityDescription insertNewObjectForEntityForName:@"ENTITY_NAME" inManagedObjectContext:context];
        [defaultFamilyLevel setValue:@"X" forKey:@"relation_name"];
        [defaultFamilyLevel setValue:@"30" forKey:@"relation_priority"];

        //insert Y level
        NSManagedObject *defaultLoveLevel;
        defaultLoveLevel = [NSEntityDescription insertNewObjectForEntityForName:@"ENTITY_NAME" inManagedObjectContext:context];
        [defaultLoveLevel setValue:@"Y" forKey:@"relation_name"];
        [defaultLoveLevel setValue:@"80" forKey:@"relation_priority"];

        //insert Z level
        NSManagedObject *defaultFriendLevel;
        defaultFriendLevel = [NSEntityDescription insertNewObjectForEntityForName:@"ENTITY_NAME" inManagedObjectContext:context];
        [defaultFriendLevel setValue:@"Z" forKey:@"relation_name"];
        [defaultFriendLevel setValue:@"50" forKey:@"relation_priority"];

        [context save:&error];
        NSLog(@"database is created ");

    }
}