0

私は次のコードを使用して、アプリのサポートファイルからsqliteDBをプルしています。これは問題なく正常に機能しました。

NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"TulsaListBars.sqlite"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
{
    NSLog(@"Cannot locate database file '%@'.", dbPath);
}else{
    NSLog(@"File Exists: %@", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
{
    NSLog(@"An error has occured: %s", sqlite3_errmsg(db));
}       
const char *sql = "SELECT * FROM Locations WHERE bar = 'yes'";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
{
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}

サポートファイルからDBを削除して、サーバーに配置していません。次のコードを使用して、サーバーからドキュメントディレクトリにDBをプルしています。ファイルがドキュメントディレクトリに送られ、すべてのテーブルで正確であることを確認しました。ただし、エラーが発生しました'prepareステートメントの問題:そのようなテーブルがありません:場所'

NSURL *url = [NSURL URLWithString:@"my web site/TulsaListBars.sqlite"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *appDocDir = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
NSString *storePath = [appDocDir stringByAppendingPathComponent:@"TulsaListBars.sqlite"];
[data writeToFile:storePath atomically:TRUE];

これは、サポートファイルではなくドキュメントディレクトリにあるDBの問題ですか?

更新:シミュレータを再起動してリセットしましたが、DBがドキュメントディレクトリにロードされていないようです。どんな助けでもいただければ幸いです。

4

1 に答える 1

0

dataWithContentsOfURLはデータベースファイルを同期的にダウンロードしており、ファイル全体を取得できない場合があります。

NSURLConnectionを使用して非同期にアプローチを変更し、デリゲートメソッドdidReceiveDataを使用してNSMutableDataオブジェクトに追加し、connectionDidFinishLoading使用してそのオブジェクトを使用します。

于 2012-08-04T09:03:24.633 に答える