2

我想打开一个 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?你能帮助我吗?

4

2 回答 2

3

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

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

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

[data writeToFile:filePath atomically:NO];

最好的办法可能是围绕数据库发布一个精简的 Web 服务包装器。使用 Web 服务而不是直接远程数据库访问有更多优点,请查看此博客文章以获得进一步的解释。

于 2013-02-25T17:24:34.137 回答
-1

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

如果是这样,解决方案很简单,您可以简单地将NSDatato 文件保存到您的文档目录中(请参阅如何将 NSData 保存到文件),然后以正常方式继续加载您的包。像这样,

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

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

快乐编码!!!

于 2013-02-25T17:29:49.453 回答