• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

objective-c - 无法从 sqlite3 数据库中选择

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:00:27 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在读取 sqlite3 数据库时遇到了一些问题。

-(void) readMessengesFromDatabase {
    sqlite3 *database;

    messenges = [[NSMutableArray alloc] init];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"Connection OK");
        const char *sqlStatement = "select * from MessagesData";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK");    else NSLog(@"connect to table FALSE");
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { //не проходит условие
            NSLog(@"Connection to table OK");
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                NSLog(@"Read rows OK");
                NSString *dbMessageID = [NSString stringWithUTF8Stringchar *)sqlite3_column_text(compiledStatement, 0)];
                NSString *dbMessageText = [NSString stringWithUTF8Stringchar *)sqlite3_column_text(compiledStatement, 1)];
                NSString *dbMessageDate = [NSString stringWithUTF8Stringchar *)sqlite3_column_text(compiledStatement, 2)];
                NSString *dbMediaOrNot = [NSString stringWithUTF8Stringchar *)sqlite3_column_text(compiledStatement, 3)];

                Message *messege = [[Message alloc] initWithName:dbMessageText messageID:dbMessageID messageDate:dbMessageDate mediaOrNot:dbMediaOrNot];

                [messenges addObject:messege];

                [messege release];
            }
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);    
}

我的第一个 NSLog 显示了与数据库的连接是否正常。但下一步“select * from MessagesData”和 if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE"); 显示“连接到 FALSE 表”。尝试使用终端从我的数据库表中选择并得到错误 "unable to open database file" 。我的错误在哪里?我的代码中没有发现任何问题...



Best Answer-推荐答案


如果您打印 sqlite3_prepare_v2 返回的错误代码,诊断问题会容易得多。数值可在 this page 上找到.

int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
if(errorCode != SQLITE_OK) {
    NSLog(@"Connect to table failed: %d", errorCode); 
}

但是,如果您甚至无法在 sqlite3 命令行工具中从数据库中进行选择,我建议您检查该文件是否存在、是否可读且格式是否正确。

尝试在您的模拟器中重现错误(如果失败,请将数据库文件复制到您的计算机,例如使用 Organizer)。尝试使用 sqlite3 运行查询(我知道您确实尝试过,但请确保您正在检查以下内容)。

如果您收到消息 Error: file is encrypted or is not a database,则表示数据库文件已损坏。如果你得到Error: no such table:,这意味着你的数据库不存在,是空的,或者根本没有得到这个表。如果你得到(如你的问题):Error: unable to open database(你在打开sqlite时得到这个,而不是在执行查询时得到),这意味着sqlite无法读取文件(对于示例权限)。

关于objective-c - 无法从 sqlite3 数据库中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072646/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap