web-dev-qa-db-ja.com

NSDictionaryをCoreDataに挿入します

NSDictionaryとCoreDataデータベースがあります。 NSDictionaryをデータベースに挿入したい。

  1. どうすればこれを行うことができますか(可能であればコードスニペット)?

  2. 辞書の属性に適したタイプは何ですか?

15
OXXY

NSDictionaryをNSDataにシリアル化する必要があります。CoreDataはNSDataを保持できます。
ただし、NSDictionaryの要素を検索(述語)することはできません。

そして、これについて考えると、NSDictionaryはデータのコレクションです。
データベース内のテーブルは、一種のデータのコレクションです。
CoreDataで、データのコレクションに最も近いものはNSManagedObjectです。

したがって、私のアドバイスは、NSDictionaryにある情報を保持するNSManagedObjectサブクラスを作成することです。 keyが属性になり、値はその属性のvalueになります。そして、そのNSManagedObjectサブクラスの属性に基づいて検索することができます。

28
Vincent Bernier

データ型が「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);
    }
}
8
Gagan_iOS

エンティティの説明を設定し、新しいオブジェクトを挿入してから、次を使用します。

[managedObject setValuesForKeysWithDictionary:dict];
5
malhal

NSDictionaryのすべてのデータを使用してエンティティを作成し、それを解析してみませんか。

チェック これはいくつかのCoreDataコードスニペットについてです。 辞書の情報を格納するためにいくつかのエンティティを作成するだけです。次に、辞書を解析して、適切な属性を保存できます。

 NSManagedObject *photoObject = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
                                                              inManagedObjectContext:context];    
 [photoObject setPhotographer:[myDictionary objectForKey:@"photographer"]];
 and so on...

XMLデータ構造がどれほど複雑であっても、Niceエンティティ構造を設定できれば、CoreDataですべてを単純にダム化するのはかなり簡単です。また、辞書全体を1つのフィールドにダンプするのではなく、時間をかけてエンティティを作成すると、クエリを簡単に実行できます。

4
MGA