Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从SQLITE数据库中删除数据_Ios_Objective C_Sqlite - Fatal编程技术网

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()
关闭数据库。这意味着您的数据库可能仍处于打开的事务中,并且很可能有两个文件:一个是main
database.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:完全同意,只是给出大概的想法。