CoreData 一次又一次地将数据添加到数据库中

Posted

技术标签:

【中文标题】CoreData 一次又一次地将数据添加到数据库中【英文标题】:CoreData is adding data again and again in to database 【发布时间】:2015-04-03 13:16:22 【问题描述】:

我已经在 APPDelegate 中实现了核心数据的东西,并创建了一个新类并从 JSON 和 NSURLConnection 获取数据 didfinishloading 我正在使用快速枚举将数据存储到核心数据中,它运行良好并使用 nsfetch 请求在 tableview 中显示,但是问题每次我启动应用程序时,它都会一次又一次地将数据存储到 sqlite 文件中,为什么会发生这种情况,方法如下

-(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 方法很常见,因为每个人都提供 请有人给我解决方案

【问题讨论】:

【参考方案1】:

因为当您启动应用程序时,您会再次下载并保存数据。请检查数据库中此类数据的可用性。 或者仅在首次启动时下载数据。

【讨论】:

最简单的方法(如果数据必须加载一次) 启动时: if (![[NSUserdefaults standartUserDefaults] objectForKey:@"alreadyLoaded"]) [self loadData]; [[NSUserDefaults standartUserDefaults] setObject:@(YES) forKey:@"alreadyLoaded"]; 或者,第二种方式。您可以在保存之前检查数据库中存在的当前对象。 NSFetchRequest *request = [[NSFetchRequest alloc] init]; [请求 setEntity:[NSEntityDescription entityForName:@"Discount" inManagedObjectContext:moc]]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", [dic objectForKey:@"name"]]; [请求集合谓词:谓词]; NSError *error = nil; NSArray *results = [moc executeFetchRequest:request error:&error]; if (results.count==0) 将数据存入数据库 @ViadZ 感谢这个解决方案我完成了这个解决方案现在我必须使用来自 JSON 的最新更新时间更新 coredata 中的数据我该怎么做 如何查看服务器的最后更新时间 您可以将属性 lastUpdateDate 添加到折扣实体,并在保存前检查此日期。或者将最后日期保存在 NSUserDefaults NSDate *lastDate =[ [NSUserDefaults standartUserDefaults] objectForKey:@"lastUpdateDate"]; if ([lastDate compare:newDate]== NSOrderedAscending) //保存新日期 //更新 userDefaults 中的 lastDate 【参考方案2】:

添加这个观察者,并检查它是否在第一次启动时被调用。

 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];

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。

以上是关于CoreData 一次又一次地将数据添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CoreBluetooth 一次又一次地发现相同的外设?

Swift:每次重新加载时都会一次又一次地添加表格视图单元格内容?

在父组件的 onClick 上一次又一次地添加子组件,每次使用新的道具到子组件

使用循环一次又一次地迭代

由于我的基本 URI 不固定,在 Webflux 中一次又一次地创建 Webclient 是不是明智?

一次又一次地解析错误[关闭]