2011-09-01 12 views
1

NSDataを使用してコアデータに配列を保存しようとしていますが、ManagedObjectContextにはオブジェクトが0個あり、呼び出すとNULLとして表示されます。私はイベントと3つの属性(chatArray、...、...)というエンティティを持っています。私は11時間試してみることができません。 NSDataが正しいので、私は間違って設定していると私は信じています。どのように私はこれを設定する必要がありますか?コアデータ管理オブジェクトのコンテキスト保存問題

UPDATE

私はチャットアプリケーションを開発していますし、私は(これは、データの配列です)テーブルビューにチャットメッセージを持っています。アプリを終了して再読み込みすると、すべてのチャット履歴を保存する必要があります。私は、文字列として入ってくるメッセージをテーブルの配列に追加します。配列を作成しなかった場合、コアデータにテキストの文字列としてメッセージを追加しました。アプリケーションをリロードするときに、テーブルビューの配列にどのように追加するのですか?

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSManagedObject *managedObject; 

//

NSArray *array = [[[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil]autorelease]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 
NSLog(@"data %@",data); 

NSLog(@"Array %@",[NSKeyedUnarchiver unarchiveObjectWithData:data]); 

[(Event*)managedObject setValue:data forKey:@"chatArray"]; 

if ([self managedObject]) 
{ 
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]]; 
    [(Event *)managedObject setChatArray:data];    } 
else { 
    Event *event = [[[Event alloc] initInsertingIntoManagedObjectContext:managedObjectContext]autorelease]; 
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]]; 
    [event setChatArray:data]; 
} 

NSError *error; 
[managedObjectContext save:&error]; 

NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:[(Event*)managedObject valueForKey:@"chatArray"]]; 

NSLog(@"chatArray %@",myArray); 
+0

私はここで何が起きると思われるのか分かりません。あなたはmanagedObjectと[self managedObject]を持っています。私はそれらが同じものであると仮定しているのでしょうか?しかし、それを確認する前にメッセージを送信してください。その後何が起こるのですか?それがnilでない場合、モデルに挿入されるコードは実行されません。そのため、以前にmanagedObjectをモデルに挿入したかどうかはわかりません。どちらの場合でもフェッチ要求を作成しますが、実行することはありません。どんなコードパスをとっていますか?コンテキストを保存した後、エラーの値をチェックしましたか? – morningstar

+0

それは2番目のものです。そしてそれはエラーはありません... –

答えて

1

ブランドン、

まず、コアデータに、BLOBはリーフノードに格納する必要があります(つまり、一つだけの関係にBLOBとバックを含むエンティティ(このパターン/慣例は、エンティティ内に他の関係があるときに大きなブロブの保持サイクルを得ることはほとんど些細なことから出てきた)

次に、なぜあなたはこれらの文字列は配列であり、タイムスタンプなどのエンティティではありません。BLOBは個々の行よりも効率的ではありません。さらに、システムはメッセージを検索し、行を柔軟に格納できます。 SQLiteは文字列を特別に扱います。

第3に、モデルエンティティを継承するのではなく、クラスを作成しているように見えます。なぜですか?これにより、コードが複雑になります。

最後に、あなたがしようとしていることを伝えるのは本当に難しいです。完全な.hファイルを含めることができますか?そして完全なメソッド宣言?

アンドリュー

+0

私はチャットアプリケーションを開発しており、私はテーブルビュー(それはデータの配列です)でチャットメッセージを持っています。アプリを終了して再読み込みすると、すべてのチャット履歴を保存する必要があります。私は、文字列として入ってくるメッセージをテーブルの配列に追加します。配列を作成しなかった場合、コアデータにテキストの文字列としてメッセージを追加しました。アプリケーションをリロードするときに、テーブルビューの配列にどのように追加するのですか? –

+0

Brandon、NSFetchedResultsControllerは、コアデータモデルとUITableViewを使って自然な方法でインターフェイスをフェッチするように特別に設計されています。 IOW、あなたが抱えている問題を解決します。アンドリュー – adonoho

関連する問題