ios - 核心数据仅保存到一个实体

标签 ios objective-c core-data

我对使用 Core Data 保存实体有点困惑。我正在制作一个屏幕,允许用户保存他们的设置(联系信息),如果他们愿意,可以在以后更改。

据我了解,每次按下“保存”按钮时,我的以下代码都会保存多个实体。

- (IBAction)saveSettings:(id)sender {

    AppDelegate *appDelegate =
    [[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *context =
    [appDelegate managedObjectContext];
    NSManagedObject *userSettings;


    userSettings = [NSEntityDescription
                  insertNewObjectForEntityForName:@"UserSettings"
                  inManagedObjectContext:context];
    [userSettings setValue: _firstName.text forKey:@"firstName"];
    [userSettings setValue: _lastName.text forKey:@"lastName"];
    [userSettings setValue: _userEmail.text forKey:@"userEmail"];
    [userSettings setValue: _zipCode.text forKey:@"zipCode"];
}

我不明白该怎么做是保存一个实体,然后每当用户在适当的文本字段中键入新值并按下“保存”时更改属性的值。

最佳答案

是的 - 因为您使用 insertNewObjectForEntityForName:,每次运行该方法时都会创建一个新的 UserSettings 对象。您可能想要做的是从数据库中获取现有设置,用该数据更新您的文本字段,呈现 View 并让用户根据需要修改详细信息,然后(当他们按下保存按钮时)保存该数据返回数据库。

我会将 userSettings 添加为属性:

    @property (strong, nonatomic) NSManagedObject *userSettings;

并在您的方法中删除 userSettings 的声明,以及您使用 insertNewObjectForEntityForName 的行。

然后创建一个新方法来处理从数据库中获取数据并将其分配给您的文本字段,如下所示:

-(void)loadSettings {

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"UserSettings"];
    NSError *error;
    NSArray *results = [context executeFetchRequest:fetch error:&error];
    if (results == nil) {
        // some error handler here
    }
    if ([results count] > 0) {
        userSettings = [results lastObject];
        _firstName.text = [userSettings valueForKey:@"firstName"];
        _lastName.text  = [userSettings valueForKey:@"lastName"];
        _userEmail.text = [userSettings valueForKey:@"userEmail"];
        _zipCode.text = [userSettings valueForKey:@"zipCode"];
    } else {
        // set your text fields to some defaults values??
    }
}

当您的 View Controller 加载时,在 viewDidLoad 方法中调用此方法。我假设您通常只有一个 UserSettings 对象(因此 lastObject 将是唯一的对象!)。如果您有许多 UserSettings 对象,则需要过滤提取以仅获取您想要的对象。为此,您需要为获取设置一个 predicate - 查看 NSPredicate 的文档。

关于ios - 核心数据仅保存到一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947818/

相关文章:

iphone - 如何从文档目录加载 PDF?

objective-c - IOS6构建链接错误

iphone - Xcode 4 核心数据 : How to use fetched property created in Data Model editor

ios - 从单元格内部删除数据

iphone - 什么时候在 iOS 中使用 CoreData 显式保存?

ios - IOS 上的 Xamarin 工具栏项目未正确对齐

ios - 尺寸检查器的自动调整大小蒙版中的支柱和 Spring 似乎在 iOS5 模拟器中不起作用

ios - 放置 UIView 覆盖 TabBar 和 NavBar

objective-c - Cocoa NSOutlineView 取消选择之前的选择

iOS/Objective-C UILabel 文本字距调整