2015-04-03 154 views
0

我已經在APPDelegate中實現了核心數據的東西,並創建了一個新類,並從JSON和NSURLConnection獲取數據didfinishloading我正在使用快速枚舉將數據存儲到核心數據,它工作良好並顯示與nsfetch請求,但問題的tableview是我每次啓動它一次又一次地將數據存儲到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 2015-04-06 15:01:38

1

因爲當您啓動應用程序時,您需要下載並再次保存數據。請檢查數據庫中此類數據的可用性。 或僅在首次啓動時下載數據。

+0

不錯,但我怎麼能做到這一點 – Thanks 2015-04-04 06:31:34

+0

最簡單的方法(如果必須將數據加載一次) 在推出: 如果([[NSUserDefaults的standartUserDefaults] objectForKey:@ 「alreadyLoaded」]!){ [self loadData]; [[NSUserDefaults standartUserDefaults] setObject:@(YES)forKey:@「alreadyLoaded」]; } – VladZ 2015-04-05 07:40:24

+0

或者,第二種方式。您可以在保存之前檢查數據庫中存在的當前對象。 NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:@「Discount」inManagedObjectContext:moc]]; NSPredicate * predicate = [NSPredicate predicateWithFormat:@「name ==%@」,[dic objectForKey:@「name」]]; [request setPredicate:predicate]; NSError * error = nil; NSArray * results = [moc executeFetchRequest:request error:&error]; 如果(results.count == 0){ 保存在數據庫中的數據 } – VladZ 2015-04-05 07:48:12

相關問題