2011-09-05 3 views
1

J'ai toujours besoin de votre aide.
J'ai ce morceau de code qui ne veut pas fonctionner.Supprimer une ligne de la base de données table et sqlite

-(void)tableView:(UITableView *)_tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 

    NSDictionary *rowVals = (NSDictionary *) [shoppingListItems objectAtIndex:indexPath.row]; 
    NSString *keyValue = (NSString *) [rowVals objectForKey:@"key"]; 

    [tableView beginUpdates]; 

    sqlite3 *db; 
    int dbrc; //Codice di ritorno del database (database return code) 
    DatabaseShoppingListAppDelegate *appDelegate = (DatabaseShoppingListAppDelegate*) [UIApplication sharedApplication].delegate; 
    const char *dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String]; 
    dbrc = sqlite3_open(dbFilePathUTF8, &db); 
    if (dbrc) { 
     NSLog(@"Impossibile aprire il Database!"); 
     return; 
    } 

    sqlite3_stmt *dbps; //Istruzione di preparazione del database 

    NSString *deleteStatementsNS = [NSString stringWithFormat: @"DELETE FROM \"shoppinglist\" WHERE key='%@'", keyValue]; 
    const char *deleteStatement = [deleteStatementsNS UTF8String]; 
    dbrc = sqlite3_prepare_v2(db, deleteStatement, -1, &dbps, NULL); 
    dbrc = sqlite3_step(dbps); 


    //faccio pulizia rilasciando i database 
    sqlite3_finalize(dbps); 
    sqlite3_close(db); 

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [shoppingListItems removeObjectAtIndex:indexPath.row]; 
    [tableView reloadData]; 

    [tableView endUpdates]; 
} 
} 

En fait, cela fonctionne très bien. Je peux glisser vers une rangée dans la table, la supprimer, j'ai mon effet de fondu, le contenu est retiré de la base de données et de la table.
Mais si je tente d'enlever un autre élément juste après le premier que j'ai un SIGABRT sur

[shoppingListItems removeObjectAtIndex:indexPath.row]; 

Si je passe à un autre onglet, revenir en arrière et supprimer une ligne, tout fonctionne bien ...
Tout des idées?

+0

Je ne sais pas ce qui ne va pas avec mon mac ... Parfois, ce code fonctionne, parfois non ... Et il y a un problème avec la dernière ligne trop ... – Oiproks

Répondre

2

J'espère que le tableau shoppingListItems contient des dictées. Donc, cet objet dans Array vous pouvez directement supprimer cet objet particulier de tableau. ESSAIE PAREIL .....

-(void)tableView:(UITableView *)_tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 

    NSDictionary *rowVals = (NSDictionary *) [shoppingListItems objectAtIndex:indexPath.row]; 
    NSString *keyValue = (NSString *) [rowVals objectForKey:@"key"]; 
    sqlite3 *db; 
    int dbrc; //Codice di ritorno del database (database return code) 
    DatabaseShoppingListAppDelegate *appDelegate = (DatabaseShoppingListAppDelegate*) [UIApplication sharedApplication].delegate; 
    const char *dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String]; 
    dbrc = sqlite3_open(dbFilePathUTF8, &db); 
    if (dbrc) { 
     NSLog(@"Impossibile aprire il Database!"); 
     return; 
    } 

    sqlite3_stmt *dbps; //Istruzione di preparazione del database 

    NSString *deleteStatementsNS = [NSString stringWithFormat: @"DELETE FROM \"shoppinglist\" WHERE key='%@'", keyValue]; 
    const char *deleteStatement = [deleteStatementsNS UTF8String]; 
    dbrc = sqlite3_prepare_v2(db, deleteStatement, -1, &dbps, NULL); 
    dbrc = sqlite3_step(dbps); 


    //faccio pulizia rilasciando i database 
    sqlite3_finalize(dbps); 
    sqlite3_close(db); 
    [shoppingListItems removeObjectAtIndex:indexPath.row]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    [tableView reloadData]; 
} 
} 
+0

Oui, j'ai des dictionnaires là. J'ai fait comme tu l'as écrit. J'ai essayé et ça a marché ... juste une fois (lol). Maintenant, j'ai cette "EXC_BAD_ACCESS" sur la même ligne. – Oiproks

+0

Pourquoi travaillez-vous sans '[tableView beginUpdates];' & '[tableView endUpdates];'? Est-ce que ça marche quand même? Je ne peux pas voir d'autres différences ... – Oiproks

+0

mis NSZombieanbled OUI dans les arguments ..... voir le rapport d'accident – Srinivas

1

Vous pouvez échanger autour

[tableView reloadData]; 
[tableView endUpdates]; 

pour le rendre

[tableView endUpdates]; 
[tableView reloadData]; 

Sinon s'il vous plaît nous dire ce que le message d'erreur pour le SIGABRT est.

+0

Ok, j'ai corrigé ça, j'ai écrit que je me trompais pour une raison ou une autre pendant que j'essayais de faire quelque chose ... mais ce n'était pas le problème. Comme j'ai écrit à Srinivas maintenant j'ai un autre problème ... – Oiproks

Questions connexes