【问题标题】:iPad SQLite3 fails INSERT queryiPad SQLite3 插入查询失败
【发布时间】:2012-01-30 02:02:36
【问题描述】:

我目前正在尝试在 iPad 上的 SQLite3 数据库中简单地插入一个新行。我之前在其他应用程序中做过多次,只是复制了代码。复制的SELECT 查询工作正常,但如果我尝试INSERT,它会在== SQLITE_DONE 失败

这是我尝试插入数据库的方式:

NSString *databaseName = @"Waypoints.sql";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
sqlite3 *database;
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
    NSString *statement = [NSString stringWithFormat:
                           @"INSERT INTO Waypoints (id, name, alt, ias, temp, tas, wd, ws, gs, mt, mh, dist, time, fuel, fuelrate) VALUES (%d,'New...','','','','','','','','','','','','','');", [self numberOfWaypoints]];
    NSLog(@"Statement: %@", statement);
    const char *sqlStatement = [statement cStringUsingEncoding:NSASCIIStringEncoding];
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)
    {
        if(sqlite3_step(compiledStatement) == SQLITE_DONE)
            NSLog(@"DATABASE: Adding: Success");
        else
            NSLog(@"DATABASE: Adding: Failed");
    }
    else
        NSLog(@"Error. Could not add Waypoint.");
    sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);

如果我按下按钮运行此代码,它会在控制台中输出DATABASE: Adding: Failed

NSLogged 语句如下所示:

插入航路点(id、name、alt、ias、temp、tas、wd、ws、gs、mt、mh、dist、时间、燃料、fuelrate)值(2,'New...','' ,'','','','','','','','','','','','');

如果我将它粘贴到终端(连接到同一个数据库文件),效果会非常好。

这使我得出结论:可能导致此问题的原因是什么?
我想也许可以写文件的权限。可能是它,但它不在捆绑包中,但已复制到设备上的文档文件夹中。

请帮助我如何让它工作?

【问题讨论】:

  • 您是否尝试过为您的 cStringUsingEncoding 使用 NSUTF8StringEncoding ?
  • ...或打印 NSLog(@"%@", [NSString stringWithUTF8String:(char*)sqlite3_errmsg(database)]);。也许这可以为您指明正确的方向
  • @IgnacioInglese,谢谢你的 errmsg 提示!它说database is locked Anytips?哦,请把你的 cmets 转换成答案

标签: ios ipad sqlite permissions


【解决方案1】:

尝试为您的 cStringUsingEncoding 或打印使用 NSUTF8StringEncoding

NSLog(@"%@", [NSString stringWithUTF8String:(char*)sqlite3_errmsg(database)]);

很高兴看到你能找到你的错误。

【讨论】:

  • 查看我的回答,了解我最终是如何解决问题的。但伊格纳西奥带我去了。谢谢。
【解决方案2】:

按照@IgnacioInglese 的提示,使用NSLog(@"%@", [NSString stringWithUTF8String:(char*)sqlite3_errmsg(database)]); 打印错误,我发现数据库已锁定。

我发现我在关闭数据库之前通过在方法中返回一个值犯了一个新手错误。解决了我的问题。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多