0

テスト目的で、アプリのサポート ファイルに sqlite DB をドロップしています。現在、これを URL に移動しようとしているので、アプリを更新せずに DB を更新できます。私は次のコードを使用しています。これは、ファイルをドキュメント ディレクトリにダウンロードするため、機能しているように見えます。問題は、サポート ファイルから古い DB を削除しましたが、そのデータがまだプルされていることです。違いがわかるように、DBに変更を加えました。

クリアする必要があるメモリはありますか?そうでない場合、ここで何が欠けていますか。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *file = [NSString stringWithFormat:@"http://www.myurl/TulsaListBars.sqlite"];
    NSURL *fileURL = [NSURL URLWithString:file];

    NSURLRequest *req = [NSURLRequest requestWithURL:fileURL];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];

    fileData = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [fileData setLength:0];
    totalFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
    NSLog(@"%@", [dirArray objectAtIndex:0]);

    NSString *path = [NSString stringWithFormat:@"%@/TulsaListBar.sqlite", [dirArray objectAtIndex:0]];

    if ([fileData writeToFile:path options:NSAtomicWrite error:nil] == NO) {
        NSLog(@"writeToFile error");
    }
    else {
        NSLog(@"Written!");
    }
}

次のコードは、DB を読み取る方法です。

-(NSMutableArray *) barList{
    thebars = [[NSMutableArray alloc] init];
    @try {
        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));
        }else{

            while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
                Bar * bar = [[Bar alloc] init];
                bar.barName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
                bar.barAddress = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];

                etc.....
4

2 に答える 2

0

データベースの古いコピーはまだdocumentsディレクトリにあります。ファイルに書き込むときにファイルがすでに存在する場合は、writeToFile:上書きする必要がありますが、もちろん同じ名前/パスである必要があります。

解決策:シミュレーター/デバイスからアプリを削除して、アプリを再度実行するだけです。また、データベースを開くときに正しいパスをアドレス指定していることを確認してください。

于 2012-08-05T19:17:29.520 に答える
0

アプリのバンドルに書き込むことはできず、ドキュメント フォルダーはそれとは別であることに注意してください。あなたのコード例は、データベースがどのように開かれているかを示していないため、ダウンロードされたファイルに関係なく、バンドルから開かれている可能性があります。より良い方法は、データベースを開くコードを didFinishLoading デリゲート メソッドに入れ、そこでダウンロードしたファイルのパスを使用することです。

于 2012-08-05T20:22:33.437 に答える