2015-04-03 2 views
0

Я реализовал основные данные в APPDelegate и создал новый класс и получал данные от JSON и NSURLConnection. Я загружал данные в основные данные, используя быстрое перечисление, он работает хорошо и отображение в Tableview с nsfetch запроса, но проблема есть каждый раз, когда я запустить приложение это снова и снова, хранящую данные для SQLite файла, почему это происходит методы нижеCoreData добавляет данные снова и снова в базу данных

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.customCellClass = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    if (self.customCellClass == nil) 
    { 
     self.customCellClass = [[CellCustom alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 
    self.customCellClass.nameLabel.text = [_myArray[indexPath.row] name];// label 
    self.customCellClass.cityLabel.text = [_myArray[indexPath.row] regions]; // label 
    self.customCellClass.detailLabel.text = [_myArray[indexPath.row] summary]; //label 
return self.customCellClass; 

} 


-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    arrayData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
    appDelegate = [[UIApplication sharedApplication ]delegate]; 
    context = [appDelegate managedObjectContext]; 
    NSString * name ; 
    NSString * summary; 
    NSString * region; 


    for (NSDictionary * dic in arrayData) { 
     name = [dic objectForKey:@"name"]; 
     summary = [dic objectForKey:@"summary"]; 
     region = [dic objectForKey:@"region"]; 

     Discount * d = [NSEntityDescription insertNewObjectForEntityForName:@"Discount" inManagedObjectContext:context]; 
     d.name = name; 
     d.summary = summary; 
     d.regions = region; 
    } 
    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"Getting error while saving data"); 
    } 
    else{ 
     NSLog(@"Saved"); 
    } 
    [listTableView reloadData]; 
} 

и методы AppDelegate просто общий, как каждый дает какой-нибудь один мне дать решение

ответ

0

Добавить этого наблюдателя и проверить, вызывается ли он при первом запуске.

NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(dataDidSave) 
           name:NSManagedObjectContextDidSaveNotification 
            object:context]; 
-(void)dataDidSave 
{ 
self.myArray = // get data from data base 
[listTableView reloadData]; 
} 
+0

. Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/74574/discussion-on-answer-by-vladz-coredata-is-adding-data-again-and-again-in- к данным). – Taryn

1

Поскольку при запуске приложения вы загружаете и сохраняете данные снова. Проверьте наличие таких данных в базе данных. Или загружайте данные только при первом запуске.

+0

в порядке, но как я могу это сделать – Thanks

+0

Самый простой способ (если данные должны быть загружены один раз) При запуске: если ([[NSUserDefaults standartUserDefaults] objectForKey: @ "alreadyLoaded"]) { [self loadData]; [[NSUserDefaults standartUserDefaults] setObject: @ (YES) forKey: @ "уже загружен"]; } – VladZ

+0

Или, второй способ. Вы можете проверить существующий текущий объект в базе данных, прежде чем вы сохраните. NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity: [NSEntityDescription entityForName: @ "Скидка" inManagedObjectContext: moc]]; NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "name ==% @", [dic objectForKey: @ "name"]]; [запрос setPredicate: предикат]; NSError * error = nil; NSArray * results = [moc executeFetchRequest: ошибка запроса: & error]; if (results.count == 0) { сохранить данные в базе данных } – VladZ

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