【问题标题】:how data storing in core data model (attributes)数据如何存储在核心数据模型(属性)中
【发布时间】:2015-11-29 00:53:13
【问题描述】:

我是学习 ios 的新手。在这里,我从核心数据开始。这里那个教程链接core data。这里我了解了模型和创建属性。就像在输入所有数据后我们必须按save 然后输入的数据将保存在模型中并显示在表格视图中。 我知道managed object 是我们的应用程序代码创建的用于存储数据的对象。

我的疑问:

按下save 按钮后。如何触发输入的数据在表格视图中显示,以及该数据如何保存在模型(核心数据)中。我对这部分感到困惑。

当我们输入所有数据并按下save 时,这些数据如何保存在核心数据中并显示在表格视图中。它是如何工作的。我要求以理论和实践的方式。

哪些方法被触发到display 表格视图中的数据。以及entered data are storing in core data (model)

如果我们删除 tableview 中的任何数据,该数据也不会显示在模型中。如何,如何工作。当我们按save 时,这些数据是如何保存在核心数据(模型-属性)中的

示例:

他们使用 3 个属性:

  1. 公司
  2. 姓名
  3. 版本

我不知道他们是如何保存的。请不要投反对票。这是我的第一个问题,它将对即将到来的初学者有所帮助。谢谢

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    当我们输入所有数据并按下保存时,这些数据是如何保存在核心数据中的......

    保存按钮有一个-save: 操作,当您点击该按钮时会触发该操作。该方法如下所示:

    - (IBAction)save:(id)sender {
        NSManagedObjectContext *context = [self managedObjectContext];
    
        // Create a new managed object
        NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Device" inManagedObjectContext:context];
        [newDevice setValue:self.nameTextField.text forKey:@"name"];
        [newDevice setValue:self.versionTextField.text forKey:@"version"];
        [newDevice setValue:self.companyTextField.text forKey:@"company"];
    
        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) {
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        }
    
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    这个方法的重要思想是:

    • 托管对象上下文:该方法所做的第一件事是获取对应用程序托管对象上下文的引用,即管理所有托管对象的对象。

    • 创建一个托管对象: 接下来,该方法会创建一个包含设备信息的新托管对象。它将您输入的数据存储在新对象中。该对象已经属于托管对象上下文,因为您必须在创建托管对象时指定 MOC。

    • 保存上下文:if 语句的条件部分中的调用保存上下文,即将其更改写入持久存储。

    在本教程的后面部分,-save: 方法被修改为也更新现有对象。您可以查看代码并看到该方法的版本首先检查视图控制器是否正在使用现有对象;如果是,那么它会更改该对象而不是创建一个新对象。

    ...并且正在表格视图中显示。

    标准UIViewController 方法之一是-viewDidAppear:DeviceViewController 覆盖此方法如下:

    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        // Fetch the devices from persistent data store
        NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"];
        self.devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    
        [self.tableView reloadData];
    }
    

    如你所见,这个方法做了这些事情:

    • 获取托管对象上下文:您无法在没有 MOC 的情况下访问 Core Data 对象。

    • 创建并执行获取请求:获取请求是您从 Core Data 存储中检索特定对象的方式。获取请求的结果是一个对象数组,保存在视图控制器的devices 属性中。

    • 重新加载表:-reloadData 消息发送到表会告诉它(意外地)从其数据源加载一组新数据。视图控制器是表格的数据源,因此当表格请求新单元格时,视图控制器会使用其devices 属性中的对象配置每个单元格。

    【讨论】:

    • 感谢您的清晰解释。我怀疑if (![context save:&error]) 这一行中的“上下文”是什么。什么是persistent store
    • context 是托管对象上下文,NSManagedObjectContext 的一个实例。也就是说,持久存储、持久存储协调器和托管对象模型是任何 Core Data 应用程序中最重要的对象,您应该在Core Data documentation 中了解它们。
    • 最后一个问题,context是用来维护核心数据栈的托管对象上下文层中包含的对象的状态吗?
    • 是的,context 是指向托管对象上下文的指针。该对象就像一个“便签本”,即您可以在上下文中对对象进行更改,并且这些更改仅存在于上下文中直到您保存上下文,此时更改被写入持久存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多