NSDictionaryとCoreDataデータベースがあります。 NSDictionaryをデータベースに挿入したい。
どうすればこれを行うことができますか(可能であればコードスニペット)?
辞書の属性に適したタイプは何ですか?
NSDictionaryをNSDataにシリアル化する必要があります。CoreDataはNSDataを保持できます。
ただし、NSDictionaryの要素を検索(述語)することはできません。
そして、これについて考えると、NSDictionaryはデータのコレクションです。
データベース内のテーブルは、一種のデータのコレクションです。
CoreDataで、データのコレクションに最も近いものはNSManagedObjectです。
したがって、私のアドバイスは、NSDictionaryにある情報を保持するNSManagedObjectサブクラスを作成することです。 key
が属性になり、値はその属性のvalue
になります。そして、そのNSManagedObjectサブクラスの属性に基づいて検索することができます。
データ型が「Transformable」の属性を作成して、辞書をCoredataに追加する別の方法を見つけました。
たとえば、プロジェクトと属性にデータ型Transformableのエンティティを作成します。 NSManagedObjectのサブクラスを生成します。属性はデータ型「id」で使用可能になり、NSDictionaryに変更されます。
以下は私がしたことです(私のNSManagedObjectサブクラス名は 'DictTest'です)
-(void)InsertIntoDataBase
{
DictTest *entityDict=(DictTest*)[NSEntityDescription insertNewObjectForEntityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
NSMutableDictionary *mutDict=[NSMutableDictionary dictionary];
[mutDict setValue:@"1" forKey:@"1"];
[mutDict setValue:@"2" forKey:@"2"];
[mutDict setValue:@"3" forKey:@"3"];
[mutDict setValue:@"4" forKey:@"4"];
[mutDict setValue:@"5" forKey:@"5"];
[mutDict setValue:@"6" forKey:@"6"];
[mutDict setValue:@"7" forKey:@"7"];
[mutDict setValue:@"8" forKey:@"8"];
[mutDict setValue:@"9" forKey:@"9"];
[mutDict setValue:@"10" forKey:@"10"];
[entityDict setInfoDict:mutDict];
NSError *error;
if(![self.managedObjectContext save:&error])
{
NSLog(@"error description is : %@",error.localizedDescription);
}
else{
NSLog(@"Saved");
}
}
レコードをフェッチするため
-(void)FetchRecord
{
NSFetchRequest *request=[[NSFetchRequest alloc]init];
NSEntityDescription *entity=[NSEntityDescription entityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSArray *fetchArray= [self.managedObjectContext executeFetchRequest:request error:nil];
for (DictTest *obj in fetchArray) {
NSLog(@"Dict is : %@",obj.infoDict);
}
}
エンティティの説明を設定し、新しいオブジェクトを挿入してから、次を使用します。
[managedObject setValuesForKeysWithDictionary:dict];
NSDictionaryのすべてのデータを使用してエンティティを作成し、それを解析してみませんか。
チェック これはいくつかのCoreDataコードスニペットについてです。 辞書の情報を格納するためにいくつかのエンティティを作成するだけです。次に、辞書を解析して、適切な属性を保存できます。
NSManagedObject *photoObject = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
inManagedObjectContext:context];
[photoObject setPhotographer:[myDictionary objectForKey:@"photographer"]];
and so on...
XMLデータ構造がどれほど複雑であっても、Niceエンティティ構造を設定できれば、CoreDataですべてを単純にダム化するのはかなり簡単です。また、辞書全体を1つのフィールドにダンプするのではなく、時間をかけてエンティティを作成すると、クエリを簡単に実行できます。