0

私は非常に奇妙な問題を抱えており、それが私を夢中にさせています。

シナリオは、サーバーから更新を受信するローカル データベース (コア データ) を持つアプリです。最も関連性の高いコードのみをここに投稿します。

以下のコードは、アップデートのダウンロードを開始する前に呼び出されます。その目的は、テーブルに復元するデータのダウンロード中に問題が発生した場合に、すべてのレコードをテーブル 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 は最初のテストで実行され、2 番目のケースにも入るため、無効ではありませんが、この出力では

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

私はすべてのオブジェクトに対して Null を取得します。オブジェクトがもはや彼女ではないかのようです。

これに関する最も一般的なエラーは、NSMutableArray が初期化されていないことですが、ご覧のとおり、初期化されています。

たとえば、変数の代わりに NSUserDefaults out にデータを保存するテストを行いましたが、同じ問題がありました。

言い忘れましたが、NSMutableArray oldImages はインスタンス変数です。

問題はありますか?

注: クラス SQLite は、データベースと対話するためのいくつかの関数を含む、より単純化されたクラスです。

4

1 に答える 1

0

この問題が原因で十分な時間を失った後、オブジェクト (Images *) の代わりに 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 オブジェクト (Images *) が保存されません。クラス NSManageObject の継承と関係がありますか?

于 2013-05-19T23:21:45.433 に答える