【问题标题】:Delete all records from the sqlite3 database iOS 7从 sqlite3 数据库 iOS 7 中删除所有记录
【发布时间】:2014-03-21 05:00:58
【问题描述】:

在我的应用程序中,我将数据存储在我的 sqlite3 数据库中,并将我所有的 sqlite3 数据库上传到我的在线服务器,一旦它复制到我的服务器,我想删除我存储在本地数据库中的所有记录。

我有两个视图控制器第一个视图控制器,我将数据存储到 sqlite3 第二个视图控制器我用来将数据加载到我给的服务器,就像用户连接到网络一样上传数据。

我想在上传数据到我的服务器后删除本地数据库中的所有记录。

我已经尝试了一些方法它不起作用请告诉我如何解决这个问题。

- (void) Delete_LoginData 
{
    if(sqlite3_open([self.filePath UTF8String], &db) == SQLITE_OK)
    {
        const char *sql = "DELETE * FROM reg";
        sqlite3_stmt *statement;
        if(sqlite3_prepare_v2(db, sql,-1, &statement, NULL) == SQLITE_OK)
        {
            sqlite3_reset(statement);
        }
     }
}

我在Reachability 中调用了这个函数。

- (BOOL)reachable
{
    Reachability *reach = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];

    if(internetStatus == NotReachable) 
    {    
    }
    else
    {
        [self Delete_LoginData];
    }

    return YES;
}   

我的文件路径。

- (NSString *) filePath
{
    NSArray *paths = filepath, YES);

    return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"bp.sqlite"];
}

代码打开数据库。

- (void)openDB
{
    if (sqlite3_open([[self filePath] UTF8String], &db)!=SQLITE_OK)
    {
        sqlite3_close(db);
        NSAssert(0, @"Database failed to open");
    }
    else
    {
        NSLog(@"database opened");
    }
}

我已使用上述方法从我的本地数据库中删除记录,但它不起作用请到我做错的地方。

谢谢。

【问题讨论】:

    标签: ios iphone ios7 sqlite delete-row


    【解决方案1】:

    使用sqlite3_step 而不是sqlite3_reset 来执行查询

    if(sqlite3_open([self.filePath UTF8String], &db) == SQLITE_OK)
    {
        const char *sql = "DELETE FROM reg";
        sqlite3_stmt *statement;
        if(sqlite3_prepare_v2(db, sql,-1, &statement, NULL) == SQLITE_OK)
        {
           if(sqlite3_step(statement) == SQLITE_DONE){
           // executed
           }else{
             //NSLog(@"%s",sqlite3_errmsg(db))
           }
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(db);
    

    【讨论】:

    • 语句需要完成,数据库需要关闭才能正确清理所有内容。
    • 是的。但这是他必须知道的。这里的问题是他只是在重置主要问题的语句。
    • 查看代码很明显它不是 OP 知道的,所以一个好的答案将提供一个完整的修复。 :)
    • 这仍有一些问题。只有在sqlite3_prepare_v2 成功时才应调用sqlite3_finalize,而只有在sqlite3_open 成功时才应调用sqlite3_close
    • 是的,让他做剩下的错误处理 :) 感谢 cmets。
    【解决方案2】:

    sqlite3_prepare_v2 不执行你需要进入它的步骤

    if(sqlite3_open([self.filePath UTF8String], &db) == SQLITE_OK){
        NSString *sql = "DELETE  FROM reg";
        const char *query_st = [sql UTF8String];
    
        if(sqlite3_prepare_v2(database, query_st, -1, &statement, NULL) == SQLITE_OK){
            // Loop through the results and add them to the feeds array
            if(sqlite3_step(statement) == SQLITE_DONE) {
                // Deleted records,....
            }else{
                 NSAssert1(0,@"Error when counting rows  %s",sqlite3_errmsg(database));
            }
            sqlite3_finalize(statement);
        }
        sqlite3_close(database);
    }
    

    【讨论】:

    • 为什么要使用while 循环?对于DELETE 查询,您只需调用一次sqlite3_step
    • @rmaddy:只是为了确保它被逐行删除。 &&谢谢你的inf
    • 这不是它的工作原理。 DELETE 一次性完成。 while 循环永远不会执行超过一次,因此毫无意义。
    • @rmaddy :已编辑,我还没有深入了解,所以非常感谢您指出我的意思。
    • 另外一件事——只有在对sqlite3_prepare_v2 的调用成功时才应该调用sqlite3_finalize。无需敲定未准备好的声明。
    【解决方案3】:

    你可以这样做,

    sqlite3_stmt *statement;
    - (void) Delete_LoginData 
    {
       // Open database first
       if(sqlite3_open([self.filePath UTF8String], &db) == SQLITE_OK)
       {
          // Sql query
          const char *sql = "DELETE FROM reg";
          // We are preparing the statement here
          if(sqlite3_prepare_v2(db, sql,-1, &statement, NULL) == SQLITE_OK)
          {
              // If that prepared statement is OK then we can execute that statement
              if(sqlite3_step(statement) == SQLITE_DONE)
              {
                  NSLog(@" Records deleted successfully..");
              }
              else
              {
                  NSLog(@" Opppsss..... Unable to delete records..");
              }
          }
          // Finalizing the statement
          sqlite3_finalize(statement);
          // Closing the database
          sqlite3_close(db);    
    }
    

    希望这对你有用...

    谢谢...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多