【问题标题】:IOS: open sqlite from an URLIOS:从 URL 打开 sqlite
【发布时间】:2013-02-10 21:59:21
【问题描述】:

我想打开一个 sqlite 数据库,但它不在我的 mainBundle 中,而是在服务器中,然后我没有这个

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];

但我有

NSString *filePath = @"http://serverAddress/info.sqlite";
NSURL *url = [NSURL URLWithString:filePath];
NSData *myData = [NSData dataWithContentsOfURL:url];

当我阅读这个数据库时,我能做什么? 如果我的数据库在 mainBundle 中,我会这样做:

if (sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {

        const char *sql = "select id, one, two from TABLE";
        sqlite3_stmt *selectstmt;

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

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {

                idNum = [NSNumber numberWithInt:(int)sqlite3_column_int(selectstmt, 0)];
                ...
                ...

但是如果我有一个 NSData?你能帮帮我吗?

【问题讨论】:

    标签: ios sqlite nsdata


    【解决方案1】:

    SQLite 是“无服务器”的,您无法从您的设备访问托管在服务器中的 SQLite 文件。如果是只读数据库,可以先下载,也可以使用不同的数据库服务器(和客户端)

    要将文件保存到文档目录并稍后阅读,请添加以下代码:

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString* filePath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];
    
    [data writeToFile:filePath atomically:NO];
    

    您最好的选择可能是围绕数据库发布一个精简的 Web 服务包装器。使用网络服务而不是直接远程数据库访问有更多的优点,请查看blog post 以获得进一步的解释。

    【讨论】:

    • aaaa 好的...我正在使用 mozilla Firefox 的 SQLite 管理器,我可以在其中将其设置为只读数据库?
    • “只读”是指您不希望更改反映在服务器中。如果是这种情况,您无需更改任何其他内容。请记住,在应用程序中所做的更改不会改变服务器数据库。
    • 啊,好吧……可以肯定……我只想在这个数据库中读取而不写入……但是我使用这段代码,它返回一个空值 NSString *filePath = @"http: //地址/info.sqlite"; NSURL *url = [NSURL URLWithString:filePath]; NSData *myData = [NSData dataWithContentsOfURL:url]; if (!myData) NSLog(@"我的数据为空"); NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[@"Documents/" stringByAppendingString:@"info.sqlite"]]; [myData writeToFile:path atomically:YES];
    • 确保可以从 Internet 访问该文件(检查网络导航器中的 URL)。
    【解决方案2】:

    我猜你想在发布应用程序时下载最新的数据库包而不是捆绑它,所以现在你已经下载了数据库文件,它以NSData 格式提供。

    如果是这样,解决方案很简单,您只需将 NSData 保存到您的文档目录 (Refer this how to save NSData to file) 中,然后继续以正常方式加载您的包。像这样,

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];
    

    请记住,在加载文件“info.sqlite”之前,您需要从 NSData 保存到文件。我还没有尝试过,但它应该可以工作:)

    编码愉快!!!

    【讨论】:

    • 您无法在应用程序包中保存文件。
    • 我提到了文档目录,可以将文件写入应用程序“文档”目录。
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2016-01-25
    • 2016-09-07
    相关资源
    最近更新 更多