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

ios - iOS 应用程序中的 SQlite 数据库在下载后被加密

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

我想创建一个简单的 iOS 应用。这个应用程序从 URL 下载一个简单的 SQlite 数据库。 但是当数据库下载并存储在 Documents 文件夹中时,我无法通过一些 SQLite 管理器打开它,因为它说它是加密的,尽管原始数据库不是。

读取这个数据库的代码也不能正常工作,我认为是因为数据库在 Documents 文件夹中加密。这是我到目前为止所得到的。

-(void) downloadDatabase {


    NSString *stringURL = @"https://www.dropbox.com/s/cq8y6x29e6ku65r/database.sqlite";
    NSURL  *url = [NSURL URLWithString:stringURL];
    NSData *urlData = [NSData dataWithContentsOfURL:url];

    if ( urlData != nil )
    {
        NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat"%@/%@", documentsDirectory,@"database.sqlite"];
        [urlData writeToFile:filePath atomically:YES];
        NSLog(@"Stahujem databazu do: %@", filePath);
    }
}

这就是我在应用程序中下载数据库的方式。

// Get the documents directory
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths[0];

    // Build the path to the database file
    NSString *databasePath = [[NSString alloc]
                    initWithString: [docsDir stringByAppendingPathComponent:
                                     @"database.sqlite"]];

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt    *statement;

    if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK)
    {
        NSString *querySQL = @"SELECT * FROM CHAMPIONS";

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            [list removeAllObjects];
            while (sqlite3_step(statement) == SQLITE_ROW)
            {

                NSString *text = [[NSString alloc]
                                  initWithUTF8String:
                                  (const char *) sqlite3_column_text(
                                                                     statement, 1)];

                [list addObject:text];
                statusOfGettingDataFromDB = @"Found!";
                NSLog(@"count: %d", [list count]);
            }
            sqlite3_finalize(statement);
        }
        sqlite3_close(myDatabase);
    }

通过这段代码,我试图从数据库中获取一些数据。但是在 sqlite3_prepare_v2 之后它会直接跳到最后。

你能告诉我一些我做错了什么吗?并建议我如何解决这个问题? 我真的很感激。谢谢。



Best Answer-推荐答案


您正在下载的 URL 当前返回的是 HTML 页面,而不是 SQLite 文件。

因此,您写入文档目录的 .sqlite 文件无效。如果您修改 URL,您的代码将正常工作

尝试使用此 URL,这是单击 Dropbox 页面上的“下载”按钮时点击的实际 URL。

https://dl.dropboxusercontent.com/s/cq8y6x29e6ku65r/database.sqlite?token_hash=AAH9fdYQzZ6zj8CzhKVBGMi4LcaCRCHNKIlw88wLLskRWQ&dl=1

我尝试了您的代码并打印了从 sqlite db 获取的 list 数组,这是我在日志中得到的结果,

(
 Ahri,
 Aatrox
 )

希望有帮助!

关于ios - iOS 应用程序中的 SQlite 数据库在下载后被加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18378281/

回复

使用道具 举报

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

本版积分规则

关注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