【问题标题】:No rows being returned in sqlite select statementsqlite select语句中没有返回行
【发布时间】:2012-08-01 20:00:22
【问题描述】:

我无法从我的数据库中选择数据。也许它只是在这里很早,但看起来好像我从来没有得到任何返回,但我在 while 语句中设置了断点以停止,它永远不会到达代码的那部分。我在这件事上搞砸了吗?我确实省略了 create 语句,因为它相当长,而且我认为它不相关,因为它确实包含 IF NOT EXISTS。我还验证了我的所有数据都在数据库中。

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"];
}

【问题讨论】:

  • 您是否在外部sqlite manager 中执行过查询并从那里得到结果??
  • 是的,返回我需要的所有行。这就是我被卡住的原因,我不明白为什么它不运行代码,对我来说一切都很好。正如我在另一条评论中所说,我认为可能是我在 SQL 语句中犯了一个错误,所以我将获取列变得非常简单,但这仍然不起作用。

标签: objective-c ios sqlite


【解决方案1】:

您说您检查了数据是否存在,您是否查看了模拟器的 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,如上述两个链接中的任何一个所述。

【讨论】:

    【解决方案2】:

    您正在选择姓名和号码.. 但从什么?你需要完成你的sql查询语句..

    【讨论】:

    • 很抱歉,我删除了大部分声明,因为它也很长。但是我尝试过使用我的长语句,并使用正确的短语句,但我仍然一无所获。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多