我正在开发一个从服务器下载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”始终为零!!
请帮帮我
答案 0 :(得分:0)
有几个问题:
您的数据库路径应为:
connectionDidFinishLoading
与sqlite3_open
相同;
作为编程风格的问题,您可能希望使用与kPath
不同的变量名称,这可能表明它是一个常量,而显然不是。
您应该检查致电writeToFile
的结果,以确保其保存正确。
如果在模拟器上运行,您应该在下载后检查文件(在Mac OS Finder中手动检查,而不是通过您的应用程序......它应该在~/Library/Application Support/iPhone Simulator/...
中)导航到模拟器的文件夹并查看下载的文件。查看文件大小,查看服务器值是否与下载的内容相匹配。
其中一个更微妙的问题是,如果您的数据库网址使用的是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
您没有向我们展示myMutableData = [[NSMutableData alloc] init];
的初始化。我猜你已经做到了。你正在追加,但是如果你忽略了初始化那个变量,它会继续发生而不会发生意外,但永远不会保存文件:
sqlite3_open
之前的问题是阴险的,因为执行sqlite3_open_v2
的过程会创建数据库(如果数据库已经存在)。我在打开数据库时经常使用NSFileManager
,因此如果数据库不存在,我可能会收到错误(或者,更好的是,首先使用sqlite3_open
检查文件是否存在)。您可能希望重置模拟器(或从设备中删除应用程序),以便删除NSURLConnection
为您创建的任何空白数据库。
与您的直接问题无关,但是除此之外,您的{{1}}代码正在将整个数据库加载到RAM中。如果它不是太大,你可以侥幸逃脱,但最好将它流式传输到持久存储,以最大限度地减少下载过程的内存占用。在设备(而不是模拟器)上运行应用程序时尤其如此。
答案 1 :(得分:0)
我解决了!
我的错误是: 我已在本地更新了数据库文件,我忘了在服务器中更新它 愚蠢的错误!
谢谢大家的帮助。