4

NSEntityDescription値を設定する前に、キーが存在するかどうかを確認する必要があります。JSON からのデータの辞書があり、オブジェクトに存在しないキーを設定したくありません。

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
for (id key in dict) {
    // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
}
4

3 に答える 3

12

セレクターをチェックしないでください。entityまたはと呼ばれるキーを想像してくださいmanagedObjectContext。NSManagedObject クラスは間違いなくこれらのセレクターに応答しますが、それらに間違ったものを割り当てようとすると、コードが即座にクラッシュすることになります。少し運が悪いと、このような何かが完全なコア データ ファイルとすべてのユーザー データを破壊します。

NSEntityDescriptionattributesByNameには、属性名と対応する を含む辞書を返すという名前のメソッドがありますNSAttributeDescriptions。したがって、これらのキーは基本的に使用できるすべての属性です。

このようなものが動作するはずです:

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
NSArray *availableKeys = [[appointmentObject.entity attributesByName] allKeys];
for (id key in dict) {
    if ([availableKeys containsObject:key]) {
        // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
    }
}
于 2012-03-13T20:45:53.640 に答える
6

これをチェックして、

BOOL hasFoo = [[myObject.entity propertiesByName] objectForKey:@"foo"] != nil;

于 2012-09-26T09:04:02.970 に答える
-1

アポイントメントオブジェクトがプロパティに応答するかどうかを確認するように求められていると思います。その場合:

if([appointmentObject respondsToSelector:NSSelectorFromString(key)])...

同等のゲッターはpropertyNameです。セッターに相当するのはsetPropertyNameです。

于 2012-03-13T19:07:05.953 に答える