2011-12-29 81 views
1

我目前正试图简单地插入一个新行到我的iPad上的SQLite3数据库。我在其他应用程序中多次完成了它,并且复制了代码。复制的SELECT查询做工精细,但如果我尝试INSERT,它在== SQLITE_DONEiPad的SQLite3失败INSERT查询

失败,这是我尝试插入到数据库:

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声明看起来是这样的:

INSERT INTO航点(ID,姓名,ALT,IAS,温度,TAS,WD,WS,GS,MT,MH,距离,时间,燃料,fuelrate )VALUES(2,'New ...','','','','','','','','','','','','','' );

如果我将它粘贴到终端(连接到同一个数据库文件),那么它可以很好地工作。

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

请问我能如何让这个工作?

+0

你有没有尝试过使用NSUTF8StringEncoding为你的cStringUsingEncoding? – 2011-12-29 19:25:36

+0

...或打印NSLog(@“%@”,[NSString stringWithUTF8String:(char *)sqlite3_errmsg(database)]);.也许这可能会指向你正确的方向 – 2011-12-29 19:28:03

+0

@IgnacioInglese,谢谢你的errmsg提示!它说'数据库被锁定了吗?Anytips?哦,请将您的意见转换成答案 – LouwHopley 2011-12-29 20:27:27

回答

2

尝试使用NSUTF8StringEncoding您cStringUsingEncoding或打印

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

很高兴见到你可以用此找到你的错误。

+0

请参阅我的回答,以了解我是如何最终解决问题的。但伊格纳西奥带领我去了。谢谢。 – LouwHopley 2011-12-30 17:06:17

0

通过按照@IgnacioInglese的提示输出错误NSLog(@"%@", [NSString stringWithUTF8String:(char*)sqlite3_errmsg(database)]);,我发现数据库被锁定。

我发现我在关闭数据库之前通过在方法中返回一个值来发生菜鸟错误。修复,解决了我的问题。