Возможный дубликат:
Основные данные не сохраняют 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.