1

我正在研究 sqlite 数据库,试图插入数据库,但它给出错误“插入时出错”数据库被锁定。我搜索了一些帖子,还写了 reset 和 finalize 语句,但它给出了同样的错误。

这是我的代码

    if(addStmt == nil) 
    {
        //const char *sql = "insert into Limittabel (limitAmt) Values(?)";
        //const char *sql="INSERT INTO Limittabel (limitAmt, Profileid) VALUES(?, ?)";
        const char *sql="insert into Limittabel (limitAmt,Profileid) Values (?,?)";
       // Insert into Limittabel (limitAmt,Profileid) Values ($500,1)

        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }
    sqlite3_bind_text(addStmt, 1, [limitAmt UTF8String], -1, SQLITE_TRANSIENT);
//    NSString *str_id_poi = [[NSString alloc] initWithFormat:@"%d", [Profileid integerValue]];
//    sqlite3_bind_text(addStmt, 2, [str_id_poi UTF8String], -1, SQLITE_TRANSIENT);
    //sqlite3_bind_text(addStmt, 2, [ UTF8String], -1, SQLITE_TRANSIENT);
     NSLog(@"***Storing END on Database ***");
    if(SQLITE_DONE != sqlite3_step(addStmt))
    {
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    }  // sqlite3_finalize(addStmt);

    else{

        //sqlite3_last_insert_rowid;
        limitid = sqlite3_last_insert_rowid(database);
         NSLog(@"YES THE DATA HAS BEEN WRITTEN SUCCESSFULLY");
    }

    sqlite3_finalize(addStmt);
    }
    sqlite3_reset(addStmt);
    //sqlite3_finalize(addStmt);
}

如果我没有打开数据库,则会出现数据库锁定错误,如果打开数据库则会出现“没有此类表”错误,请帮助我。谢谢

4

4 回答 4

1

我不明白“如果我不打开数据库,它会给出数据库锁定错误”的评论,因为你根本无法在不打开数据库的情况下使用它。不先打开数据库就调用 SQLite 函数是没有意义的。也许我不理解这个评论。

但是暂时忽略了这一点,你后来说,“如果打开数据库,它会给出'没有这样的表'错误”:你确定你找到了正确的数据库吗?问题是,如果您打开数据库但没有找到,则会创建一个空白数据库。你确定这没有发生在你身上吗?如果这可能发生在您身上,您可能想要

  1. 重置模拟器(如果您正在使用模拟器)或删除并重新安装应用程序,以确保删除sqlite3_open可能为您创建的任何空白数据库;和

  2. 在打开数据库之前检查以确保数据库存在,或者将出现的 替换sqlite3_opensqlite3_open_v2的第三个参数SQLITE_OPEN_READWRITE和第四个参数NULL. 请参阅SQLite 在 Xcode 中访问数据库时不会准备查询

  3. 顺便说一句,您没有提及您是从Documentsbundle还是Documents.

  4. 如果您在模拟器上执行此操作,我有时会发现从我的 Mac 检查模拟器使用的数据库很有帮助。因此,我转到“~/Library/Application Support/iPhone Simulator/5.1/Applications/”(将 5.1 替换为您正在使用的任何版本的模拟器......如果Library隐藏,则Terminal使用取消隐藏chflags nohidden ~/Library),然后进入特定应用程序的目录,进入它的Documents文件夹,然后在 Mac 命令行sqlite3程序中打开数据库。您可以使用它来检查数据库并确保数据库符合您的预期。

只是对“没有这样的表”错误的一些想法。

于 2012-08-07T06:01:11.627 回答
0

试试这个代码,

if(sqlite3_open([YourDatabasePath UTF8String],&db) == SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat: @"insert into Limittabel (limitAmt,Profileid) Values (?,?)"];

    char *errmsg=nil;

    if(sqlite3_exec(db, [querySQL UTF8String], NULL, NULL, &errmsg)==SQLITE_OK)
    {
       NSLog(@"YES THE DATA HAS BEEN WRITTEN SUCCESSFULLY");
    }

}
sqlite3_close(db);

如果此代码不起作用,则说明您的查询有问题,请再次检查您的查询。这段代码在我身边有效。

于 2012-08-06T12:57:33.837 回答
0

jonty 处理数据库必须首先打开数据库,然后我们在数据库中进行更改,如果它给出错误 No such table 那么我建议您检查数据库中是否存在表,即是否创建了这样的表。

于 2012-08-06T12:12:17.160 回答
0

这是用于从 SQLite 数据库创建、打开、插入和检索数据的链接。它会帮助你。

SQLite Datase 从数据库中创建、插入和检索点击这里

于 2012-08-06T11:44:37.953 回答