【问题标题】:Sqlite Database locked in some case while inserting dataSqlite 数据库在插入数据时在某些情况下被锁定
【发布时间】:2012-05-04 13:34:33
【问题描述】:

我的 Iphone 应用程序有问题。 有时我的应用程序成功运行,但在某些情况下它给出“数据库被锁定异常”,这就是为什么我无法从 sqlite 数据库读取或插入数据。 如果有人有解决方案,请建议我。 这是我将数据插入数据库的代码 谢谢。

-(void)insertDataIntoDatabase
{   
    NSLog(@"insertDataIntoDatabase-----1");

    @try{
        tUserName=userNameTf.text;
        tLevel=[NSString stringWithFormat:@"%d",level];
        tMoves=[NSString stringWithFormat:@"%d",moves];

        NSLog(@"tLevel;;;%@",tLevel);
        //   NSString *tdatabaseName = @"FlipScoreBord.sqlite";
        sqlite3_stmt *addStatement;
        //  NSArray *tdocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
        //  NSString *tdocumentsDir = [tdocumentPaths objectAtIndex:0];
        // NSString *tdatabasePath = [tdocumentsDir stringByAppendingPathComponent:tdatabaseName];
        NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO Moves (User_Name,User_Label,User_Moves) VALUES('%@','%@','%@')",tUserName,tLevel,tMoves];
        const char *sql = [insertQuery cStringUsingEncoding:NSUTF8StringEncoding];

        if(sqlite3_prepare_v2(tdatabase, sql, -1, &addStatement, NULL) != SQLITE_OK)
        {
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(tdatabase));
        }
        sqlite3_bind_text(addStatement, 0, [tUserName UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStatement, 1, [tLevel UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStatement, 2,  [tUserName UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(addStatement))
        {
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(tdatabase));
            sqlite3_reset(addStatement);
        }
        sqlite3_close(tdatabase);
    }

    @catch (NSException *r)
    {
        NSLog(@"Exception---- %@",r);
    }
    NSLog(@"insertDataIntoDatabase-----2");  

}

【问题讨论】:

  • 这是一个多线程应用程序吗?这肯定会导致锁定问题。
  • 不,它不是多线程应用程序

标签: ios sqlite


【解决方案1】:

我不得不承认我使用了 FMDB(一个将我与 SQLite 函数隔离开的 SQLite 包装器),但有几件事看起来很奇怪:

  1. 如果你 sqlite3_prepare_v2() 一个语句,你不需要你的 sqlite3_finalize() 吗?

  2. 看起来您正在关闭数据库,但没有打开它。似乎这打开了您的 sqlite3_open() 语句和您的 sqlite3_close() 调用不平衡的可能性。您是否 100% 确信这不是问题所在?我会尝试在 open 和 close 语句中放入 NSLog,并确保它们是平衡的。

这两个问题的结合让我想知道你是否指的是你目前有 sqlite3_close() 的 sqlite3_finalize()。

只是一些想法。

【讨论】:

    【解决方案2】:

    此链接列出了触发数据库锁定错误的原因:

    http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked

    引用其中一个原因:

    当 SELECT 在同一个表上处于活动状态时尝试写入该表。

    由于您没有在语句中调用 sqlite3_finalize,因此之前的“SELECT”语句可能会阻止您的“INSERT”。在调用 sqlite3_close 之前尝试添加 sqlite3_finalize。

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多