Ios 无法从SQLITE数据库中删除数据
我在这里做错了什么??数据库中有三个表,我需要从中删除所有数据Ios 无法从SQLITE数据库中删除数据,ios,objective-c,sqlite,Ios,Objective C,Sqlite,我在这里做错了什么??数据库中有三个表,我需要从中删除所有数据 -(void)deleteAllDataFromTables { AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSLog(@"%@", appDelegate.databasePath); int result = sqlite3_open([appDelegate.databasePath UTF8Str
-(void)deleteAllDataFromTables
{
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"%@", appDelegate.databasePath);
int result = sqlite3_open([appDelegate.databasePath UTF8String], &db);
if(result == SQLITE_OK)
{
NSLog(@"deleteCalled");
const char *deleteData = "delete from CustomerNumberTable";
int outcome = sqlite3_prepare_v2(db, deleteData, -1, &statement, NULL);
if(outcome == SQLITE_OK)
{
int res = sqlite3_step(statement);
if(res == SQLITE_DONE)
{
NSLog(@"deleted from Customer Table");
}
else
{
NSLog(@"not able to execute step statement");
}
}
else
{
NSLog(@"not deleted from Customer Table");
NSLog(@"the error is %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
const char *deleteData2 = "delete from KeyCodeTable";
int outcome2 = sqlite3_prepare_v2(db, deleteData2, -1, &statement, NULL);
if(outcome2 == SQLITE_OK)
{
int res = sqlite3_step(statement);
if(res == SQLITE_DONE)
{
NSLog(@"deleted from KeyCodeTable");
}
else
{
NSLog(@"not able to execute step statement");
}
}
else
{
NSLog(@"not deleted from KeyCodeTable");
NSLog(@"the error is %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
const char *deleteData3 = "delete from SRNumberTable";
int outcome3 = sqlite3_prepare_v2(db, deleteData3, -1, &statement, NULL);
if(outcome3 == SQLITE_OK)
{
int res = sqlite3_step(statement);
if(res == SQLITE_DONE)
{
NSLog(@"deleted from SRNumberTable");
}
else
{
NSLog(@"not able to execute step statement");
}
}
else
{
NSLog(@"not deleted from SRNumberTable");
NSLog(@"the error is %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
}
else
{
NSLog(@"Not able to open database for deleting");
}
}
在控制台上,我得到
Application[54974:a0b] deleteCalled
2014-01-03 16:12:55.442 Application[54974:a0b] deleted from Customer Table
2014-01-03 16:12:55.443 Application[54974:a0b] deleted from KeyCodeTable
2014-01-03 16:12:55.445 Application[54974:a0b] deleted from SRNumberTable
但是当我在mac上打开数据库时,数据在那里是完整的。。!!我的代码有什么问题??为什么数据没有被删除???我认为您正在将数据库从捆绑包复制到文档目录。因此,更新后的数据库将出现在documents目录中。您似乎是从您的工作区中查看数据库,而该数据库永远不会更新。您的代码使用
sqlite3\u open()
打开数据库,但不会使用sqlite3\u close()
关闭数据库。这意味着您的数据库可能仍处于打开的事务中,并且很可能有两个文件:一个是maindatabase.db
,另一个是日志文件database.db journal
,其中包含删除表的未提交意图
在将数据库文件从设备复制到主机之前,应确保应用程序关闭数据库。至少,将主数据库和日志文件作为一组复制。它仍然可能存在一致性问题,但您应该看到您所做的更改。第一件事不要重复编写相同的功能代码,创建一个从给定表名中删除所有数据的函数 第二,确保在mac中查看正确的sqlite文件 看这个
-(void)deleteAllData
{
[self deleteTable: CustomerNumberTable];
[self deleteTable: SRNumberTable];
[self deleteTable: KeyCodeTable];
}
-(void)deleteTable:(NSString *)table;
{
const char *dbpath=[appDelegate.databasePath UTF8String];
if (sqlite3_open(dbpath, &dtdb)==SQLITE_OK)
{
sqlite3_stmt *stmt;
const char *qry=[[NSString stringWithFormat:@"delete from %@",table] UTF8String];
sqlite3_prepare_v2(dtdb, qry, -1, &stmt, NULL);
if (sqlite3_step(stmt)==SQLITE_DONE)
{
NSLog(@"%@ Table data deleted",table);
}
sqlite3_finalize(stmt);
sqlite3_close(dtdb);
}
}
尝试将
sqlite3\u prepare\u v2
改为sqlite3\u exec
。这对我来说很管用
仅参考:
char *errMsg;
const char *dbPath = [databasePath UTF8String];
if (sqlite3_open(dbPath, &database) == SQLITE_OK) {
NSLog(@"Db OPened ");
NSString *queryLists = [NSString stringWithFormat:@"delete from Table_name"];
const char *query_stmt = [queryLists UTF8String];
if (sqlite3_exec(database, query_stmt, NULL, NULL, &errMsg)
!= SQLITE_OK){
NSLog(@"Error %s", errMsg);
NSLog(@"Table Not Deleted");
}
}
也许你必须提交交易并关闭数据库。从答案中可以看出,没有人真正知道。告诉我们数据库在设备上的位置。请告诉我们您是否使用了事务。您是否检查了正确的数据库?你的数据库在哪里?在主捆绑包或文档目录中?它位于文档目录中事务必须明确开始,不是吗?我在OP的代码中没有看到。第三:不要重复打开/关闭数据库。相反,存储/传递关于的数据库句柄。@trojanfoe:完全同意,只是给出大概的想法。