2013-08-14 4 views
0

Может кто-нибудь помочь выяснить, что я сделал не так в этом коде? пытаясь заполнить базовую структуру данных через JSON файлОшибка JSON для Core Data SQLITE

// Create the managed object context 
    NSManagedObjectContext *context = managedObjectContext(); 
    // Save the managed object context 
    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); 
     exit(1); 
    } 

    NSError* err = nil; 
    NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Exercises" ofType:@"json"]; 
    NSArray* Exercises = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] 
                 options:kNilOptions 
                  error:&err]; 
    //NSLog(@"Imported Exercises: %@", Exercises); 
    NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:context]; 
    NSString *theJSONString = @"{\"key\":\"value\"}"; 
    NSError *theError = NULL; 
    NSDictionary *jsonDict = [NSDictionary dictionaryWithJSONString:theJSONString error:&theError]; 

    Exercise *exercise = [NSEntityDescription insertNewObjectForEntityForName:@"Exercise" 
                 inManagedObjectContext:context]; 

    [Exercises enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

     NSDictionary *attributes = [[object entity] attributesByName]; 
     for (NSString *attribute in attributes) { 
      id value = [jsonDict objectForKey:attribute]; 
      if (value == nil) { 
       continue; 
      } 
      [exercise setValue:value forKey:attribute]; 
     } 
     NSError *error; 
     if (![context save:&error]) { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     } 
    }]; 

Отредактировано: кодекс теперь компилирует, но я получаю нулевые значения в модели данных ядра. Thanks

+0

В этом коде вы ничего не спасаете. Вызовы сохранения ничего не сделают. Где подкласс Entity для подачи данных JSON? – CodenameLambda1

ответ

1

Во-первых, это не ошибка SQLite, это стандартная базовая ошибка Objective-C. У вас была бы такая же проблема, даже если вы не использовали хранилище Core Data на базе SQLite.

Давайте работать в обратном направлении, откуда она выглядит как ошибка происходит, что:

NSDictionary *attributes = [[obj entity] attributesByName]; 

Вы звоните entity на obj. Но откуда взялись obj? Отсюда:

[Exercises enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

ОК, так obj пришел из Exercises. Что имеется в Exercises?

NSArray* Exercises = [NSJSONSerialization 
    JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] 
    options:kNilOptions 
    error:&err]; 

Exercises представляет собой массив из вещей, которые NSJSONSerialization дал вам. Метод JSONObjectWithData:options:error: дает эквиваленты какао для содержимого JSON. Это не дает вам управляемые объекты. В этом случае похоже, что ваш JSON создал массив NSDictionary.

Так что случилось это:

  1. Вы использовали NSJSONSerialization и получили массив словарей
  2. Вы итерированный над этим массивом
  3. Вы попытались вызвать entity на членах массива, только массив членами являются NSDictionary экземпляров, и этот класс не реализует entity.

Ваш код никогда не создает никаких объектов Core Data в любом месте. Вот почему вы не получаете никаких объектов Core Data. Ваш код сбой, потому что вы пытаетесь вызвать методы Core Data на объектах, которые не реализуют эти методы.

+0

Привет, Tom, спасибо за ваш ответ, я впервые использовал «уродливый/грубый» способ заполнения данных ядра JSON. Как отправлено на ваш пост в какао, мой gf. Затем я попытался реализовать путь NSDictionary к исходному коду, который у меня был. Как создать основной объект данных «Упражнения», который можно использовать с категорией NSDictionary с touchJSON. Спасибо – user2512523

+0

Создайте управляемый объект, используя один из стандартных способов, например. '[NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:]'. Мои сообщения в CIMGF касались того, как получить данные из JSON для управляемого объекта, но вам все равно нужно сначала создать управляемый объект. –

+0

Может ли этот процесс использоваться для нескольких объектов? и от одного до многих отношений? – user2512523

Смежные вопросы