使用Downloaded sqlite3文件

时间:2013-03-08 15:49:32

标签: iphone ios sqlite

我正在开发一个从服务器下载sqlite3文件并在以后随时使用它的应用程序,但是在下载后我无法读取它的数据

我使用此代码下载:

myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[myConnection start];

我使用此代码获取数据:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [myMutableData appendData:data];
}

我使用此代码保存文件:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [myMutableData writeToFile:kPath atomically:YES]
}

保存文件后,我尝试使用此代码:

{
    const char *SQL = [@"SELECT * from table1" UTF8String];
    sqlite3 *database = NULL;
    NSString *file = kPath;
    if (sqlite3_open([file UTF8String], &database) == SQLITE_OK)
        sqlite3_exec(database, SQL, myCallback, (__bridge void*)myArray, NULL);
    sqlite3_close(database);
}

我的回调功能是:

static int myCallback(void *context, int count, char **values, char **columns) {
    // "count" is always zero !!

    return SQLITE_OK;
}

我的问题是:回调函数中的“count”始终为零!!

请帮帮我

2 个答案:

答案 0 :(得分:0)

有几个问题:

  1. 您的数据库路径应为:

    • 大概应该由NSSearchPathForDirectoriesInDomains;

    • 生成
    • connectionDidFinishLoadingsqlite3_open相同;

    • 作为编程风格的问题,您可能希望使用与kPath不同的变量名称,这可能表明它是一个常量,而显然不是。

  2. 您应该检查致电writeToFile的结果,以确保其保存正确。

  3. 如果在模拟器上运行,您应该在下载后检查文件(在Mac OS Finder中手动检查,而不是通过您的应用程序......它应该在~/Library/Application Support/iPhone Simulator/...中)导航到模拟器的文件夹并查看下载的文件。查看文件大小,查看服务器值是否与下载的内容相匹配。

  4. 其中一个更微妙的问题是,如果您的数据库网址使用的是HTTP协议但未找到,则您不会看到didFailWithError中的NSURLConnection,而是会轻率地看到NSURLConnection从Web服务器下载Web服务器的404错误页面。通过手动检查生成的文件,确保下载成功。

    如果您正在使用didReceiveResponse并通过HTTP下载并希望以编程方式确保您没有收到错误,则可以使用- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response { if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *httpResponse = (id)response; NSInteger statusCode = [httpResponse statusCode]; if (statusCode == 200) { // everything is ok } else if (statusCode >= 400) { // something went wrong, such as statusCode == 404 or something like that } } }

    myMutableData
  5. 您没有向我们展示myMutableData = [[NSMutableData alloc] init]; 的初始化。我猜你已经做到了。你正在追加,但是如果你忽略了初始化那个变量,它会继续发生而不会发生意外,但永远不会保存文件:

    sqlite3_open
  6. 之前的问题是阴险的,因为执行sqlite3_open_v2的过程会创建数据库(如果数据库已经存在)。我在打开数据库时经常使用NSFileManager,因此如果数据库不存在,我可能会收到错误(或者,更好的是,首先使用sqlite3_open检查文件是否存在)。您可能希望重置模拟器(或从设备中删除应用程序),以便删除NSURLConnection为您创建的任何空白数据库。

  7. 与您的直接问题无关,但是除此之外,您的{{1}}代码正在将整个数据库加载到RAM中。如果它不是太大,你可以侥幸逃脱,但最好将它流式传输到持久存储,以最大限度地减少下载过程的内存占用。在设备(而不是模拟器)上运行应用程序时尤其如此。

答案 1 :(得分:0)

我解决了!

我的错误是: 我已在本地更新了数据库文件,我忘了在服务器中更新它 愚蠢的错误!

谢谢大家的帮助。