0

私のエンティティが空である理由を教えてください。

エンティティに JSON を入力しています。エンティティの属性の名前は JSON と同じです

これは私のエンティティにデータを入力するための私のコードです:

  NSManagedObjectContext *cxt = [self managedObjectContext];
    NSManagedObject *newBoxes = [NSEntityDescription insertNewObjectForEntityForName:@"Boxes" inManagedObjectContext:cxt];
    NSDictionary *parsedFeed = [[newBoxes entity] attributesByName];
    for (NSString *key in parsedFeed) {
        id value = [parsedFeed objectForKey:key];
        // Don't assign NSNull, it will break assignments to NSString, etc.
        if (value && [value isKindOfClass:[NSNull class]])
            value = nil;

        @try {
            [Boxes setValue:value forKey:key];
        } @catch (NSException *exception) {
            // Exception means such attribute is not defined in the class or some other error.
        }
    }

    NSError *err;
    if (![cxt save:&err]) {
        NSLog(@"An error has occured: %@", [err localizedDescription]);
    }



NSLog(@"ENTITY  %@", newBoxes);

これは私の NSLOG の結果です:

2012-04-30 11:16:23.352 Wonder[9987:fb03] ENTITY  <Boxes: 0x6d87330> (entity: Boxes; id: 0x6d8b010 <x-coredata://EFDCC0BA-644D-42AC-8DE8-452F02B7C680/Boxes/p26> ; data: {
    codeArticle = nil;
    descriptionBox = nil;
    dlu = 0;
    kindBox = nil;
    nameBox = nil;
    nbActivities = 0;
    note = 0;
    priceBox = 0;
    texteMarketing = nil;
    typeBox = nil;
})

これは私のJSONです:

{
    "totalBox":{
        "boxes":[
        {
         "codeArticle": "WPCDE01C412L",
         "nameBox": "boxName",
         "texteMarketing": "boxTextMarketing",
         "descriptionBox" : "boxDescritpion",
         "nbActivities": 1650,
         "kindBox": "boxKind",
         "typeBox": "boxType",
         "priceBox": 20,
         "dlu": 2014,
         "note": 3
        },
        {
         "codeArticle": "BOOYAKA!!",
         "nameBox": "boxNameName",
         "texteMarketing": "boxTextMarketing",
         "descriptionBox" : "boxDescritpion",
         "nbActivities": 1650,
         "kindBox": "boxKind",
         "typeBox": "boxType",
         "priceBox": 39,
         "dlu": 2014,
         "note": 3
         }
        ]
            }
}

これは私のエンティティです:

ここに画像の説明を入力

編集:私はJSONを与えるので、コアデータにエンティティを入力するために何を読むべきかを「伝える」必要がありますよね?

dataToDisplay = [[NSMutableArray alloc] init];

//récupération du chemin vers le fichier contenant le JSON
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"JSON" ofType:@"txt"];

//création d'un string avec le contenu du JSON
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];   

//Parsage du JSON à l'aide du framework importé
NSDictionary *json    = [myJSON JSONValue];

//récupération  du total des Boxes
NSDictionary *resultats    = [json objectForKey:@"totalBox"];
4

2 に答える 2

2

エンティティにJSONを入力していますが、エンティティの属性はJSONと同じ名前です。

質問に投稿したコードには含まれていません。

この行:

NSManagedObject *newBoxes = [NSEntityDescription insertNewObjectForEntityForName:@"Boxes" inManagedObjectContext:cxt];

新しい空の管理対象オブジェクトを作成します。データはありません。

このコード:

NSDictionary *parsedFeed = [[newBoxes entity] attributesByName];

管理対象オブジェクトのすべての属性名と属性の説明のディクショナリを取得します。これはモデルの一部です。なぜあなたがそれにアクセスするのをわざわざしているのか私にはわかりません。

このコード

for (NSString *key in parsedFeed) {
    id value = [parsedFeed objectForKey:key];
    // Don't assign NSNull, it will break assignments to NSString, etc.
    if (value && [value isKindOfClass:[NSNull class]])
        value = nil;

    @try {
        [Boxes setValue:value forKey:key];
    } @catch (NSException *exception) {
        // Exception means such attribute is not defined in the class or some other error.
    }
}

かなり奇妙です。属性の説明(Core Dataに属性が文字列、数値などであることを通知します)にアクセスし、Boxesその値にキーを設定します。ボックスをモデル化するために作成しBoxesたサブクラスだと思います。NSManagedObject例外をキャッチすることに決めていなかった場合、ここでコードが「セレクターに応答しません」でクラッシュすると思います。

基本的に、コードで何をしても意味がありません。あなたがする必要があるのは、JSONのNSDictionaryを取得することです。NSJSONSerializationを参照て、現在parsedFeedを使用している場所でそれを使用してください。そうすれば、コードは多かれ少なかれ機能Boxesします(に置き換えnewBoxesます。ただし、いくつかの変更を提案します。

NSDictionary *parsedFeed = [NSJSONSerialization JSONObjectWith....]; // can use an NSData or a stream
for (NSString *key in parsedFeed) {
    id value = [parsedFeed objectForKey:key];
    // Don't assign NSNull, it will break assignments to NSString, etc.
    if ([value isEqual:[NSNull null]]) // nil is already handled OK
        value = nil;

    if ([legalKeys containsObject: key]) // see comment below
    {
        [newBoxes setValue: value forKey: key];
    } 
    else
    {
        // report bad data
    }       
}

legalKeysソースコードで作成したセットであり、JSONから合法的に設定できるキーを示しています。これはおそらく外部からのものです。これは検証の一形態であり、設定されるべきではないキーが不正なデータによって設定されるのを防ぎます。たとえば、 。NSObjectというプロパティがありますscriptingProperties。おそらく、着信JSONにそれを設定させたくないでしょう。

于 2012-04-30T09:50:39.073 に答える
1

上記のコードでは、非オブジェクトに値を設定しようとしています。

[Boxes setValue:value forKey:key];

する必要があります

[newBoxes setValue:value forKey:key];

http://rentzsch.github.com/mogenerator/と、JSON と CoreData に関するこの非常に役立つ記事http://www.cimgf.com/2012/01/11/handling-incoming-をご覧になることをお勧めします。 json-redux/

乾杯

于 2012-04-30T09:25:11.317 に答える