CoreData一次又一次地将数据添加到数据库
我已经在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方法只是时间常见于每一个给出 有一个给我的解决方案请
添加此观察者并检查它是否在第一次启动时被调用。
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];
}
因为当您启动应用程序时,您需要下载并再次保存数据。请检查数据库中此类数据的可用性。 或仅在首次启动时下载数据。
不错,但我怎么能做到这一点 – Thanks 2015-04-04 06:31:34
最简单的方法(如果必须将数据加载一次) 在推出: 如果([[NSUserDefaults的standartUserDefaults] objectForKey:@ “alreadyLoaded”]!){ [self loadData]; [[NSUserDefaults standartUserDefaults] setObject:@(YES)forKey:@“alreadyLoaded”]; } – VladZ 2015-04-05 07:40:24
或者,第二种方式。您可以在保存之前检查数据库中存在的当前对象。 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
注释不适用于扩展讨论;这个对话已经[转移到聊天](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