2015-10-23 4 views
1

Вот мой код, который я использую для контроллера табличного представления. Проблема в том, что строки не удаляются и не отображаются в моем представлении таблицы? Что делать, чтобы удалить мои данные из базы данных coredata, а также в моей строке?Как удалить данные в базе данных данных?

Как я могу сделать это, используя мой код ниже:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self fetchdata]; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
    [self fetchdata]; 
    [self.tableView reloadData]; 
} 
-(void)fetchdata 
{ 
    self.fetchrequest=[[NSFetchRequest alloc]init]; 
    NSEntityDescription *entity=[NSEntityDescription entityForName:@"Student" inManagedObjectContext:_managedObjectContext]; 
    [_fetchrequest setEntity:entity]; 
    NSError *error; 
    self.fetchedobjects=[_managedObjectContext executeFetchRequest:_fetchrequest error:&error]; 
    if (_fetchedobjects != nil) 
    { 
     _studentattributes=[[NSMutableArray alloc]initWithArray:_fetchedobjects]; 
    } 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return _studentattributes.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellreuse" forIndexPath:indexPath]; 

    _STUDENT=[_studentattributes objectAtIndex: indexPath.row]; 
    cell.textLabel.text=_STUDENT.name; 

    _namearray=[[NSMutableArray alloc]init]; 
    [self.namearray addObject:_STUDENT.name]; 
    _classarray=[[NSMutableArray alloc]init]; 
    [self.classarray addObject:_STUDENT.standard]; 
    _sectionarray=[[NSMutableArray alloc]init]; 
    [self.sectionarray addObject:_STUDENT.section]; 
    _rollarray=[[NSMutableArray alloc]init]; 
    [self.rollarray addObject:_STUDENT.roll]; 

    return cell; 
} 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"seguereuse"]) 
    { 
     EnterDetailViewController *enterdetail=(EnterDetailViewController *)[segue destinationViewController]; 
     enterdetail.managedObjectContext=self.managedObjectContext; 
    } 

    else if ([segue.identifier isEqualToString:@"seguedisplay"]) 
    { 
     NSIndexPath *indexpath=[self.tableView indexPathForSelectedRow]; 
     DisplayViewController *display=(DisplayViewController *)[segue destinationViewController]; 
     display.studentdetails=[[NSMutableArray alloc]initWithObjects:[_namearray objectAtIndex:indexpath.row],[_classarray objectAtIndex:indexpath.row],[_sectionarray objectAtIndex:indexpath.row],[_rollarray objectAtIndex:indexpath.row], nil]; 
    } 
} 



- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 

     [_managedObjectContext deleteObject:[_studentattributes objectAtIndex:indexPath.row]]; 


     [self.tableview reloaddata]; 

      } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    { 

    } 

} 

теперь, как разобраться в проблеме?

+0

Удалите объект из массива _studentattributes, а также после удаления записи из coredata. Также перезагрузите таблицу. – Adeel

+0

@AdeelMiraj Его удаление, но когда я запускаю приложение снова, он показывает ту же строку снова –

+0

ссылается на ответ в этой теме http://stackoverflow.com/questions/10482311/delete-an-object-in-core-data – Adeel

ответ

1

Обычным способом в основе представления таблицы просмотра, чтобы удалить объект из базы данных, из массива содержимого и из представления таблицы в блоке обновления.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     [tableView beginUpdates]; 
     NSManagedObject *objectToDelete = [_studentattributes objectAtIndex:indexPath.row]; 
     [_managedObjectContext deleteObject: objectToDelete]; 
     [_studentattributes removeObject: objectToDelete]; 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [tableView endUpdates]; 
     NSError *error; 
     [_managedObjectContext save:&error]; 
     if (error) { 
     NSLog(@"An error occurred while deleting a row: %@", error); 
     } 
    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    { 

    } 
} 
+0

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

+0

- метод, называемый вообще? – vadian

+0

, который говорит о сэре –

0

Проблема заключается в том, что вы держите ссылку на fetchedObjects, и после ее удаления вы только перезагружаете представление таблицы.

Кроме того, вы не вызывая managedObjectContext упорствовать/Сохраните изменения

Так что ваш код должен быть больше похож:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 

     [_managedObjectContext deleteObject:[_studentattributes objectAtIndex:indexPath.row]]; 
     [_managedObjectContext save:nil]; // Tell the context to save the changes. 

     [self fetchdata]; // Needs to fetch data again so your _studentattributes you have the right count. 

     [self.tableview reloaddata]; 

    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    { 

    } 

} 
+0

Сэр, еще одна проблема заключается в том, что я использовал идентификатор раскрытия, чтобы показать деталь в контроллере представления, но не отображал детали строки, которую я кликнул, но только показывал детали моих недавно введенных данных. –

+0

@Abhisek Hi , я не совсем понял, как это связано с исходным вопросом. Если вам нужна помощь в этом вопросе, я предлагаю вам либо открыть новый вопрос с этой конкретной проблемой, либо отредактировать эту самую, и объяснить каждую проблему, с которой вы сталкиваетесь. –

+0

хорошо сэр, пожалуйста, ответьте на вопрос, который я задал в этом вопросе. Сэр, проблема заключается в том, что мои данные не удаляются навсегда из базы данных. его показ снова, когда я снова запускаю симулятор. –

0

Прежде всего, я вижу, вы вызываете fetchdata несколько раз. Я бы посоветовал вам позвонить ему один раз в loadView, а затем позвонить [self.tableview reloadData] в viewWillAppear. Также обратите внимание, что вы вызываете reloaddata, а не reloadData на свой вид в таблице.

Далее, управление контекстом объекта - это блокнот, в котором вы можете вносить изменения. Но в конечном счете, вы должны сохранить его по телефону:

if (![context save:&error]) { 
    NSLog(@"Couldn't save: %@", error); 
} 

PS: Я предполагаю, основываясь на ваш комментарий к Адиль, что ваш источник _studentattributes данных становится обновленным правильно, прежде чем вы снова звоните reloadData на ваш взгляд таблицы, как бы вести внешний вид стола.

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