2012-06-28 77 views
0

我想从ios应用程序中的sqlite数据库读取数据。当我运行应用程序时,它可以打开数据库,但在日志文件中显示消息 - “准备语句存在问题”。我不知道什么是错的我准备发言这里是我的代码 -ios - sqlite准备语句

-(NSString *)dataFilePath{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:kFilename]; 
} 

viewDidLoad中我有 -

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    myarray = [[NSMutableArray alloc]init]; 

    sqlite3 *database; 
    if(sqlite3_open([[self dataFilePath]UTF8String], &database)!=SQLITE_OK){ 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 

    const char *createSQL = @"SELECT ID, TITLE FROM FIRST ORDER BY TITLE;"; //first is the table in the database 
    sqlite3_stmt *sqlStmt; 
    if(sqlite3_prepare_v2(database, [createSQL UTF8String], -1, &sqlStmt, nil)!=SQLITE_OK){ 
     NSLog(@"Problem with prepare statement"); //this is where the code gets stuck and I don't know why 
    }else{ 

     while(sqlite3_step(sqlStmt)==SQLITE_ROW){ 
      NSInteger number = sqlite3_column_int(sqlStmt, 0); 
      NSString *title = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStmt, 1)]; 
      [myarray addObject:title]; 
     } 
     sqlite3_finalize(sqlStmt); 
    } 
    sqlite3_close(database); 
} 
+0

可能的路径,DB是不正确的,在我来说,我已经加入现有的SQLite数据库的项目,并在这种情况下,它会被存储在'AppName.app'文件夹下不'Documents' – shebelaw

回答

1

如果你准备语句失败,而不仅仅是报告,尝试检索错误消息“有准备的语句问题”,例如,

NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database)); 

这可能会给你的问题的一个更好的指标。

我以前见过的一个问题是,数据库可能找不到(因为它没有包含在软件包中,名称中的拼写错误等),但标准sqlite3_open函数将创建它,如果它是不存在,因此sqlite3_open将成功,但在新创建的空白数据库中将找不到该表。比sqlite3_open更好:

sqlite3 *database; 
if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 
    sqlite3_close(database); // not sure you need to close if the open failed 
    NSAssert(0, @"Failed to open database"); 
} 

这样你会得到一个警告,如果没有找到数据库。但是,如果您已经完成sqlite3_open,则可能会有空白数据库,因此您可能需要在使用sqlite3_open_v2进行尝试之前重置模拟器和/或从设备中删除应用程序。

+0

另外,我会对使用与SQL保留字(如FIRST)相同的表名(或字段名)保持警惕。我怀疑这是问题,但充其量,这是令人困惑的。 – Rob

+0

当我使用更新的sqlite3_open_v2语句并清理了模拟器后,它在NSAssert语句失败并给出消息 - 无法打开数据库。为什么不打开数据库,我不知道 –

+0

@AshishAgarwal数据库是你的包的一部分吗?打开目标设置,点击“Build Phases”选项卡,并展开“Copy Bundle Resources”,并确保您的数据库是要包含的文件列表。您还可以通过在Finder中打开模拟器的文件夹来确认应用中包含的内容,例如“〜/库/应用程序支持/ iPhone模拟器”(如果你没有看到库文件夹,去终端并发出命令“'chflags nohidden〜/ Library”来取消隐藏)。 – Rob

0

尝试改变零为NULL。另外,尝试将SQL语句定义为一个const char。

.... 

const char *sql = "SELECT ID, TITLE FROM FIRST ORDER BY TITLE"; 
sqlite3_stmt *sqlStmt; 

if(sqlite3_prepare_v2(database, sql, -1, &sqlStmt, NULL)!=SQLITE_OK){ 

.... 
+0

同样的问题,没有什么发生 –

1

你可以尝试几件事情。

  1. 清洁您的应用程序,从模拟器或设备&删除尝试重新安装一个新的副本,看看它是否工作。

  2. 在终端中打开您的数据库&尝试在那里运行您的sql语句。检查你是否获得了期望的输出。