CoreData, моя сущность пуста... почему?

не могли бы вы помочь мне и сказать мне, почему моя сущность пуста?

я заполняю свою сущность своим 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"];

person user1256827    schedule 30.04.2012    source источник


Ответы (2)


В приведенном выше коде вы пытаетесь установить значения для не объекта.

[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/

Ура

person mbogh    schedule 30.04.2012
comment
спасибо, чувак, или твой ответ, ты прав, я ошибался, но он все еще не заполняет мою сущность (с моим JSON), но, наконец, я подумал о том, что я глуп, я не даю своему JSON посмотреть на мое редактирование, пожалуйста :) - person user1256827; 30.04.2012
comment
Также кажется, что вы вообще не получаете доступ к содержимому JSON, NSDictionary *parsedFeed = [[объект newBoxes] attributeByName];. Это просто извлекает все ключи из сущности NSManagedObject... - person mbogh; 30.04.2012
comment
это заполнить мои Coredata? с моим json? я серьезно запутался, мне нужна помощь: / я просто хочу заполнить свои основные данные своим json, а затем я сделаю запрос, например: мне нужен весь кодСтатья, цена которой составляет 25 евро. [Поля setValuesForKeysWithDictionary:json]; - person user1256827; 30.04.2012

я заполняю свою сущность своим 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, который вы создали для моделирования коробки. Если бы вы не решили поймать исключение, я предполагаю, что ваш код рухнет здесь с «не отвечает на селектор».

По сути, все, что вы делаете в своем коде, не имеет никакого смысла. Что вам нужно сделать, так это получить NSDictionary JSON, см. 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 устанавливал это.

person JeremyP    schedule 30.04.2012