2

シンプルなiOSアプリを作りたい。このアプリは、URL から単純な SQLite データベースをダウンロードします。しかし、データベースがダウンロードされて Documents フォルダーに保存されると、元のデータベースが暗号化されていないにもかかわらず暗号化されていると表示されるため、一部の SQLite マネージャーでデータベースを開くことができません。

また、このデータベースを読み取るためのコードが機能していません。これは、データベースが Documents フォルダーで暗号化されているためだと思います。これが私がこれまでに得たものです。

-(void) downloadDatabase {


    NSString *stringURL = @"https://www.dropbox.com/s/cq8y6x29e6ku65r/database.sqlite";
    NSURL  *url = [NSURL URLWithString:stringURL];
    NSData *urlData = [NSData dataWithContentsOfURL:url];

    if ( urlData != nil )
    {
        NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"database.sqlite"];
        [urlData writeToFile:filePath atomically:YES];
        NSLog(@"Stahujem databazu do: %@", filePath);
    }
}

これは、アプリでデータベースをダウンロードする方法です。

// Get the documents directory
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths[0];

    // Build the path to the database file
    NSString *databasePath = [[NSString alloc]
                    initWithString: [docsDir stringByAppendingPathComponent:
                                     @"database.sqlite"]];

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt    *statement;

    if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK)
    {
        NSString *querySQL = @"SELECT * FROM CHAMPIONS";

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            [list removeAllObjects];
            while (sqlite3_step(statement) == SQLITE_ROW)
            {

                NSString *text = [[NSString alloc]
                                  initWithUTF8String:
                                  (const char *) sqlite3_column_text(
                                                                     statement, 1)];

                [list addObject:text];
                statusOfGettingDataFromDB = @"Found!";
                NSLog(@"count: %d", [list count]);
            }
            sqlite3_finalize(statement);
        }
        sqlite3_close(myDatabase);
    }

このコードを使用して、データベースからデータを取得しようとしています。しかしsqlite3_prepare_v2、最後にジャンプした後。

私が間違ったことを教えてください。そして、これを修正する方法を教えてください。本当にありがたく思います。ありがとうございました。

4

1 に答える 1

1

ダウンロードしている URL は現在、SQLite ファイルではなく HTML ページを返しています。

したがって、.sqliteドキュメント ディレクトリに書き込むファイルは無効です。URL を変更すると、コードは正しく機能します

代わりにこの URL を試してみてください。これは、Dropbox ページの [ダウンロード] ボタンをクリックしたときに表示される実際の URL です。

https://dl.dropboxusercontent.com/s/cq8y6x29e6ku65r/database.sqlite?token_hash=AAH9fdYQzZ6zj8CzhKVBGMi4LcaCRCHNKIlw88wLLskRWQ&dl=1

私はあなたのコードを試しlist、sqlite db から取得した配列を出力しました。これがログに記録された結果です。

(
 Ahri,
 Aatrox
 )

それが役立つことを願っています!

于 2013-08-22T11:02:15.940 に答える