IOS:从URL打开sqlite

时间:2013-02-25 17:07:16

标签: ios sqlite nsdata

我想打开一个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];

当我读到这个db我能做什么? 如果我的db在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?你能救我吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

[data writeToFile:filePath atomically:NO];

可能最好的办法是在数据库周围发布一个瘦Web服务包装器。使用Web服务而不是直接远程数据库访问有更多优点,请查看此blog post以获得进一步说明。

答案 1 :(得分:-1)

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

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

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

记住在加载文件“info.sqlite”之前,需要从NSData保存到该文件。我没试过这个,但它应该有效:))

快乐的编码!!!