0

我有一个非常奇怪的问题,它让我发疯。

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 类是我编写的一个类,其中包含一些更简化的与数据库交互的函数。

4

1 回答 1

0

由于这个问题而损失了足够的时间,我决定保存 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 有关系吗?

于 2013-05-19T23:21:45.433 回答