2012-07-30 43 views
0

我无法从数据库中选择数据。也许它早在这里,但它看起来好像我从来没有得到任何回报,但我把断点放在while语句内停止,它永远不会到达代码的那一部分。我在这里弄到了什么东西吗?我没有创建声明,因为它很长,我不认为它是相关的,因为它确实包含IF NOT EXISTS。我还证实,我确实拥有数据库中的所有数据。在sqlite select语句中没有返回行

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

NSString *createSQL = @"--CREATE STATEMENT HERE --"; 

char *errorMsg; 

if(sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { 
    sqlite3_close(database); 
    NSAssert(0,@"Error creating table: %s", errorMsg); 
} 

NSString *query = @"SELECT name, number FROM DATA"; 
sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     int myNumber = sqlite3_column_int(statement, 1); 
     char *name = (char *)sqlite3_column_text(statement, 0); 
     NSString *message = [NSString stringWithFormat:@"Number: %d, Name: %@", myNumber,name]; 
     //DO MORE STUFF HERE. 
    } 
    sqlite3_finalize(statement); 
} 
sqlite3_close(database); 

dateFilePath方法:

-(NSString*)dataFilePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:@"Spaces.sqlite"]; 
} 
+0

你在外部'sqlite管理器'中执行了你的查询吗? – Sumanth 2012-07-30 13:39:13

+0

是的,返回我需要的所有行。这就是为什么我卡住了,我不明白为什么它不运行代码,一切看起来都对我好。正如我在我的其他评论中所说的,我认为也许我在SQL语句中犯了一个错误,所以我非常简单地转到了列,但仍然不起作用。 – atrljoe 2012-07-30 13:40:42

回答

0

你说你检查看到数据在那里,你看看你的模拟器的Documents文件夹中的副本,或者你检查Xcode中的副本项目? (如果可以的话,您确实需要检查数据库中应用程序的Documents文件夹的内容)。我问的原因是,一个非常常见的错误是假设成功调用sqlite3_open意味着它找到了您的数据库。它没有。如果它没有找到你的数据库,它会为你创建一个空白的。

如果在编译之前准备一个数据库,我真的鼓励你使用sqlite3_open_v2代替sqlite_open这里讨论:SQLite will not prepare query when accessing database in Xcode

所以,如果是这样的问题,我建议:

  1. 重置您的模拟器(通过模拟器菜单上的“重置内容和设置”,或者只是删除应用程序并重新安装)以摆脱那里的空白数据库。

  2. 确保数据库包含在您的包中,如上述链接中所述。

  3. 确保以编程方式将数据库从包复制到文件,如下所述:Unable to connect SQLite Database in iOS

  4. 而且使用sqlite3_open_v2在上述两种链接的描述。

0

你选择的姓名和号码..但什么?你需要完成你的SQL查询语句..

+0

对不起,我把大部分声明摘下来,因为它也很长。但我已经尝试过使用我的长篇声明,并使用正确的简短声明,而我仍然得不到任何东西。 – atrljoe 2012-07-30 13:22:19