Nano Hash - криптовалюты, майнинг, программирование

Проблема с атрибутом Core Data, возвращающим 0

Возможный дубликат:
Основные данные не сохраняют NSString.

Всем привет!

В настоящее время возникает странная проблема с Core Data в моем последнем приложении. По сути, я занимаюсь анализом JSON и добавлением каждого объекта в Core Data под соответствующим атрибутом. Это отлично работает, насколько я могу судить по NSLogs, которые я установил. Однако когда дело доходит до отображения одного из значений в UITableView, оно всегда возвращает 0 по какой-то неизвестной причине.

Вот функция, которую я использую для хранения объектов в объекте Core Data.

-(void)syncNotes {

UIApplication *app = [UIApplication alloc];
app.networkActivityIndicatorVisible = YES;

NSDictionary *params = [NSDictionary dictionaryWithObject:authToken forKey:@"api_key"]; 

[[LRResty client] get:@"http://notacio.us/api/note" parameters:params withBlock:^(LRRestyResponse *response){

    if(response.status == 200) {
        NSLog(@"Successful Connection \n%@", [response asString]);

        // Create SBJSON object to parse JSON
        SBJSON *parser = [[SBJSON alloc] init];

        // parse the JSON string into an object - assuming [response asString] is a NSString of JSON data
        NSDictionary *object = [parser objectWithString:[response asString] error:nil];

        NSFetchRequest *noteFetch;
        NSManagedObject *newNote;

        appDelegate =(NotaciousAppDelegate *) [[UIApplication sharedApplication] delegate];

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:appDelegate.managedObjectContext];
        NSArray *fetchedNotes;

        NSArray *notes = [object valueForKey:@"result"];
        for (NSDictionary *singleNote in notes){

            noteFetch=[[NSFetchRequest alloc] init];
            [noteFetch setEntity:entity];
            NSPredicate *pred=[NSPredicate predicateWithFormat:@"ID==%@",[singleNote objectForKey:@"note id"]];
            [noteFetch setPredicate:pred];

            NSError *fetchError=nil;
            fetchedNotes=[appDelegate.managedObjectContext executeFetchRequest:noteFetch error:&fetchError];

            if (fetchError!=nil) {
                NSLog(@"syncNotes fetchError=%@,details=%@",fetchError,fetchError.userInfo);
            }
            if ([fetchedNotes count]==0) {


                NSString *notelocked = [singleNote objectForKey:@"note locked"];

                NSString *notecreated = [singleNote objectForKey:@"note created"];
                NSString *noteupdated = [singleNote objectForKey:@"note updated"];
                NSString *notetitle = [singleNote objectForKey:@"note title"];
                NSString *notesummary = [singleNote objectForKey:@"note summary"];
                NSString *noteid = [singleNote objectForKey:@"note id"];
                NSString *notecontent = [singleNote objectForKey:@"note content"];

                NSLog(@"Note Title: %@",notetitle);
                NSLog(@"Note Summary: %@",notesummary);
                NSLog(@"Note ID: %@",noteid);
                NSLog(@"Note Content: %@",notecontent);
                NSLog(@"Note Created: %@",notecreated);
                NSLog(@"Note Updated: %@",noteupdated);
                NSLog(@"Note Locked: %@",notelocked);


                newNote = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:appDelegate.managedObjectContext];
                [newNote setValue:notecontent forKey:@"content"];
                [newNote setValue:notesummary forKey:@"summary"];
                [newNote setValue:notetitle forKey:@"title"];
                [newNote setValue:noteid forKey:@"ID"];
                [newNote setValue:notecreated forKey:@"created"];
                [newNote setValue:noteupdated forKey:@"updated"];
                [newNote setValue:notelocked forKey:@"locked"];

                NSError *error = nil;
                if (![appDelegate.managedObjectContext save:&error]) {
                    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                    abort();
                }


            }

        }

        [noteFetch release];
        app.networkActivityIndicatorVisible = NO;

    }

    if (response.status == 404) {
        NSLog(@"FAIL\n%@", [response asString]);
        app.networkActivityIndicatorVisible = NO;
    }

}];

}

Таким образом, NSLog от меня выводит строки, которые представляют собой объекты, проанализированные из JSON и которые будут сохранены, следующие.

2011-03-31 10:52:23.334 Notacious[755:707] Note Title: Business Draft
2011-03-31 10:52:23.335 Notacious[755:707] Note Summary: Make sure you get one to Pez by end of w
2011-03-31 10:52:23.336 Notacious[755:707] Note ID: 676
2011-03-31 10:52:23.336 Notacious[755:707] Note Content: Business Draft
Conclusion is about 150 words, the rest is for the body of the report.
2011-03-31 10:52:23.337 Notacious[755:707] Note Created: Thu Feb 24 17:02:13 -0800 2011
2011-03-31 10:52:23.339 Notacious[755:707] Note Updated: Thu Feb 24 17:10:43 -0800 2011
2011-03-31 10:52:23.339 Notacious[755:707] Note Locked: 0

Как видите, для всего заданы значения. Тем не менее, моя проблема становится немного странной здесь. При настройке UITableViewCell и попытке получить значение для обновления оно возвращает 0. Я вызываю значение следующим образом:

NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

NSLog(@"%@",[[managedObject valueForKey:@"title"] description]);
NSLog(@"%@",[[managedObject valueForKey:@"updated"] description]);

NSString *updated = [[managedObject valueForKey:@"updated"] description];
NSString *parsedDate = [NSDate getNoteTime:updated];

NSLog(@"Before Format: %@",updated);
NSLog(@"After Format: %@",parsedDate);

Что, в свою очередь, регистрирует следующее:

2011-03-31 10:56:22.544 Notacious[755:707] Business Draft
2011-03-31 10:56:22.545 Notacious[755:707] 0
2011-03-31 10:56:22.548 Notacious[755:707] time0
2011-03-31 10:56:22.549 Notacious[755:707] note:0, current:1301531182
2011-03-31 10:56:22.550 Notacious[755:707] Before Format: 0
2011-03-31 10:56:22.550 Notacious[755:707] After Format: ********

Как видите, обновленная строка возвращает 0. Кто-нибудь может пролить свет на то, почему это происходит?

ИЗМЕНИТЬ

Вместо этого я попытался сделать это с созданным valueForKey, и вы ни за что не догадаетесь, что произошло. Это работало отлично. Поэтому единственное, о чем я могу думать, это то, что когда мы сохраняем значение в атрибуте Core Data, оно не сохраняется должным образом. Что странно, потому что и созданные, и обновленные атрибуты являются NSString. На самом деле все в объекте Core Data — это NSString.


  • Ну, я не лучший с CoreData, но мне кажется, что вы вытаскиваете данные дважды. Похоже, вы дважды пытаетесь вытащить обновленную строку. Я сомневаюсь, что это ошибка, но не похоже, что вы это заметили. Кроме того, вы можете сократить этот 'UIApplication *app = [UIApplication alloc]; app.networkActivityIndicatorVisible = YES;' до этого '[[Общее приложение UIApplication] setNetworkActivityIndicatorVisible:YES]; Я думаю, что это так или его [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 31.03.2011

Ответы:


1

Наиболее вероятное объяснение состоит в том, что у вас есть несоответствие между классами объектов, возвращаемыми словарем, и объектами, ожидаемыми сущностью. Например. noteUpdated должно быть датой, но в коде нет ничего, что обеспечивало бы это. Если вы попытаетесь установить дату, используя строковое значение, которое не может быть проанализировано, дата может сообщить нулевое значение. Вы должны проверить классы, возвращаемые словарями, чтобы убедиться, что они подходят для атрибутов, которым они назначены.

Кроме того, это использование описания не является необходимым:

NSLog(@"%@",[[managedObject valueForKey:@"title"] description]);

... потому что NSLog все равно отправляет сообщение с описанием. Здесь у вас есть описание строки, возвращаемой description. Это может или не может точно отражать стоимость объекта. Просто используйте:

NSLog(@"%@",[managedObject valueForKey:@"title"]);

При устранении неполадок я бы рекомендовал печатать управляемые объекты напрямую следующим образом:

NSLog(@"%@",manageObject);

... что позволит вам увидеть все в более сыром виде.

31.03.2011
  • Однако проблема уменьшается, если я использую созданный valueForKey. Который устанавливается точно так же при вытягивании нот. Странно и бессмысленно, что один не работает, а другой работает отлично. 01.04.2011
  • В первую очередь устраните возможные ошибки журналирования. Простое ведение журнала непосредственно самого объекта покажет вам все значения атрибутов/свойств, поскольку объект их содержит. Если они там отображаются правильно, то это просто ошибка регистрации. Если нет, то проблема заключается в том, где вы устанавливаете значения атрибута/свойства. 01.04.2011
  • Когда я делаю NSLog(@%@,managedObject); он любит выплевывать следующую ошибку. завершение вызывается после создания экземпляра 'NSException'. Программа получила сигнал: "SIGABRT". Так что я не могу видеть, что происходит... 06.04.2011
  • Если у вас есть управляемый объект, вы должны иметь возможность напрямую регистрировать его. Если вы все еще получаете ошибку, значит, у вас есть что-то совершенно другое. 20.04.2011
  • Хм, очень странная вещь происходит. 20.04.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..