【问题标题】:NSMutableArray does not save objects retrieved from the database (core data)NSMutableArray 不保存从数据库中检索到的对象(核心数据)
【发布时间】:2013-05-17 20:37:44
【问题描述】:

我有一个非常奇怪的问题,它快把我逼疯了。

senario 是一个带有本地数据库(核心数据)的应用程序,它从服务器接收更新,我将在这里只发布最相关的代码。

在开始下载更新之前调用下面的代码。它的目的是如果您在下载要恢复到表的数据时遇到问题,将所有记录保存到表 IMAGES。

//Passa contexto do ManagedObjectContext do appDelegate
     AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
     managedObjectContext = [appDelegate managedObjectContext];

    if ([SQLite count:managedObjectContext :@"IMAGENS"]!=0) {
        NSMutableArray *fetchResults = [SQLite select:managedObjectContext :@"IMAGENS" :NULL];

        oldImages = [[NSMutableArray alloc] initWithArray:[fetchResults copy]];

        NSLog(@"SALVOU OLD IMAGENS");

    }

我检查了槽测试数据实际上是保存的,目前没有问题。

如果您在下载过程中遇到问题,则会调用此其他 trexo 代码,其目的是清理表格并插入我在上面发布的方法中保存的 IMAGES 对象..

   -(void)recoverImages{
        if ([oldImages count]!=0) {
            NSMutableArray *fetchResults = [SQLite select:managedObjectContext :@"IMAGENS" :NULL];

                //Se tiver Objetos salvos na tabela, todos serão apagados
                if ([fetchResults count]!=0) {
                    for (Imagens *imagem in fetchResults) {
                        //Deleta objeto
                        [SQLite deletarImagem:managedObjectContext :imagem];
                        NSLog(@"deletou imagens no recover!");
                    }


                    for (Imagens *img in oldImages) {
                        Imagens *imagem = (Imagens *)[NSEntityDescription insertNewObjectForEntityForName:@"IMAGENS" inManagedObjectContext:managedObjectContext];

                       [imagem setCategoria:img.categoria];
                       [imagem setTitulo:img.titulo];
                       [imagem setDescricao:img.descricao];
                       [imagem setImagem:img.imagem];

                        NSError *er;
                        if(![managedObjectContext save:&er]){
                            NSLog(@"Houve um erro muito grave ao salvar imagem old");
                        }else{
                            NSLog(@"\nTítulo:%@",imagem.titulo);
                            NSLog(@"\nDescrição:%@",imagem.descricao);
                            NSLog(@"\nCategoria:%@",imagem.categoria);
                        }

                    }
            }
        }

    }

NSMutableArray 不是无效的,因为它在第一个测试中运行并且也进入了第二种情况,但是对于这个输出

NSLog (@ "\ nTítulo:% @" imagem.titulo);
NSLog (@ "\ nDescription:% @" imagem.descricao);
NSLog (@ "\ nCategoria:% @" imagem.categoria);

所有对象都为 Null,就好像这些对象不再是她一样。

最常见的错误是没有初始化 NSMutableArray,但正如你所见,它已被初始化。

例如,我已经完成了将数据保存在 NSUserDefaults 而不是 var 上的测试,但出现了同样的问题。

忘了说,NSMutableArray oldImages 是一个实例变量。

你能看出什么问题吗?

注意:SQLite 类是我编写的一个类,其中包含一些更简化的与数据库交互的函数。

【问题讨论】:

  • imagem = img; 肯定有问题 - 你用不同的指针覆盖指向新创建对象的指针。我还不明白你的逻辑,但也许你必须将img 的属性复制到imagem
  • 其实也已经试过这段代码了[image setCategoria: img.categoria]; [图片集标题:img.titulo]; [图像集Descricao:img.descricao]; 【图片集图片:img.imagem】;但我在调试输出中得到 null
  • 放弃你的 SQLite 类并使用标准的核心数据方法。
  • 我不明白你的意思,但无论如何都没有帮助我......而且我写的SQLite类工作得很好,实际上它里面有标准方法,只是一个更简单的使用,而不是用 10 行代码重复数据,只用一个。

标签: ios xcode sqlite core-data


【解决方案1】:

在由于这个问题而浪费了足够的时间之后,我决定保存 NSMutableArray 而不是对象(图像 *),保存一个包含您的信息的 NSDictionaty,如下所示:

oldImages = [[NSMutableArray alloc] init];

        for (Imagens *img in fetchResults) {
            if (img) {
                NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:img.categoria,@"categoria",img.titulo,@"titulo",img.descricao,@"descricao",img.imagem,@"imagem", nil];

                [oldImages addObject:dic];

            }
        }

然后恢复:

 for (NSDictionary *img in oldImages) {
                Imagens *imagem = (Imagens *)[NSEntityDescription insertNewObjectForEntityForName:@"IMAGENS" inManagedObjectContext:managedObjectContext];

                [imagem setCategoria:[img valueForKey:@"categoria"]];
                [imagem setTitulo:[img valueForKey:@"titulo"]];
                [imagem setDescricao:[img valueForKey:@"descricao"]];
                [imagem setImagem:[img valueForKey:@"imagem"]];

                NSError *er;
                if(![managedObjectContext save:&er]){
                    NSLog(@"Houve um erro muito grave ao salvar imagem old");
                }else{
                    NSLog(@"\nTítulo:%@",[img valueForKey:@"titulo"]);
                    NSLog(@"\nDescrição:%@",[img valueForKey:@"descricao"]);
                    NSLog(@"\nCategoria:%@",[img valueForKey:@"categoria"]);
                }

            }

由于某种原因没有保存我的 NSMutableArray 对象(图像 *),它与继承类 NSManageObject 有关系吗?

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多