2011-09-05 152 views
1

我仍然需要你的幫助。
我有這段不想工作的代碼。從表和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]; 
} 
} 

實際上,它工作正常。我可以滑動到表中的一行,刪除它,我有我的淡入淡出效果,內容從數據庫和表中刪除。
但如果我嘗試只是第一個後刪除另一個元素我有

[shoppingListItems removeObjectAtIndex:indexPath.row]; 

如果我移動到另一個選項卡,回去刪除行一個SIGABRT,一切工作正常...
任何想法?

+0

我不知道這有什麼錯我的Mac ...有時此代碼的工作,有時不我,而與最後一排也是個問題... – Oiproks

回答

2

我希望shoppingListItems數組包含字典。所以有數組中的對象可以直接從數組中刪除該特定的對象。 嘗試像這樣.....

-(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

是的,我有在那裏的字典。我按你寫的那樣做了。我試過了,它的工作......只有一次(哈哈)。現在我在同一行上有這個「EXC_BAD_ACCESS」。 – Oiproks

+0

爲什麼你沒有'[tableView beginUpdates];'&'[tableView endUpdates];''?無論如何它工作嗎?我看不到任何其他區別... – Oiproks

+0

把NSZombieanbled YES在參數.....看到崩潰報告 – Srinivas

1

你可能要交換周圍

[tableView reloadData]; 
[tableView endUpdates]; 

,使其

[tableView endUpdates]; 
[tableView reloadData]; 

或者請告訴我們的SIGABRT錯誤信息是什麼。

+0

好的,我解決了這個問題,我寫錯了,因爲某種原因,也許我正在嘗試做某件事情......但那不是問題所在。正如我寫信給斯里尼瓦斯現在我有另一個問題... – Oiproks