【问题标题】:Core Data, problems when saving or retrieving, don't know where it is核心数据,保存或检索时出现问题,不知道在哪里
【发布时间】:2012-02-18 13:19:36
【问题描述】:

我对 Core Data 很陌生,但我遇到了一个我不明白的问题。我不知道出了什么问题。

我将使用以下代码从 JSON 文件中读取的实体“重量”的 7 个对象保存到我的持久存储中:

for (NSDictionary *values in aWeightValues)
    {
        weightValues = [NSEntityDescription insertNewObjectForEntityForName:@"Weight" 
                                                     inManagedObjectContext:moc];

        [weightValues setValue:[typeWeight objectForKey:@"unit"] forKey:@"unit"];
        [weightValues setValue:[values objectForKey:@"timestamp"] forKey:@"date"];
        [weightValues setValue:[values objectForKey:@"value"] forKey:@"amount"];

        if (![moc save:&error])
        {
            NSLog(@"Problem saving: %@", [error localizedDescription]);
        }
    }

for 循环进行了 7 个循环,这意味着它被正确保存(谈到对象的数量)。

但是,当我尝试以这种方式从持久存储中检索数据时:

-(NSMutableArray *) extractWeightEntities 
{
    AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
    NSError *error;
    NSManagedObjectContext *moc = [appDelegate managedObjectContext];

    NSEntityDescription *entityWeight = [NSEntityDescription entityForName:@"Weight" inManagedObjectContext:moc];
    NSFetchRequest *request = [[[NSFetchRequest alloc]init]autorelease];
    [request setEntity:entityWeight];
    entityWeight = nil;

    fetchResult = [[moc executeFetchRequest:request error:&error]mutableCopy];
    return (fetchResult);

}

并尝试显示检索到的每个对象的一个​​属性,我的 TableView 中有 1044 行!我应该只有 7 个。

我做错了什么?是我保存还是检索时出现问题?

希望您能帮助解决这个问题。非常感谢提前!

【问题讨论】:

    标签: sqlite core-data save nsfetchrequest persistent-storage


    【解决方案1】:

    您不需要在循环的每次迭代中调用 save,这是非常低效的。之后保存。

    在你的循环上放一个断点,并确保它只遍历它 7 次。

    数据是否不断累积?您是否每次都删除该应用程序?如果您继续运行代码 - 它将继续向您的数据存储添加对象,除非您在插入它们之前检查它们是否存在于数据存储中。

    【讨论】:

    • 但是如果每次迭代都不保存,我是否每次都覆盖该属性?它会保存7个不同的属性吗?好的,我不会每次都删除应用程序,也不会删除持久存储中的数据。感谢那。如何进行检查,以免在数据库中重复行?
    • insertNewObjectForEntityForName 每次调用时都会在托管对象上下文中创建一个新对象。托管对象上下文是核心数据的“内存中”部分。当您调用 save 时,它​​会将托管对象上下文的状态保存到持久后备存储中。我注意到您将其存储在实例变量中-您需要这样做吗? - 所以是的,你每次都覆盖 weightValues - 但是,每次迭代都是一个新的 weightValues 对象,它存储在你的 MOC 中。
    • 您使用“查找并创建”模式检查重复项 - 您执行 NSFetchRequest 并查看核心数据是否已经包含您要插入的内容(使用 NSPredicate 作为“where claus”过滤您的结果。然后,只有在获取失败时才插入新对象。尽管如此,您需要提高效率,因为持续获取会损害性能。请参阅核心数据编程指南“高效实现查找或创建”
    • 非常感谢 :) 如果不是实例变量,我该如何存储呢?
    • “总是首先给对象最严格的范围”。这是编程中的规则。所以你最严格的范围是在你的循环内。所以 WeightValues *weightValue = [NSEntityDescription insertNewObjectForEnti.... 等等在你的循环中......当然,除非你在循环完成后需要对象。这是你想知道的......或者你到底是什么意思“我如何存储它”
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2011-05-30
    相关资源
    最近更新 更多