9

SQLite データベースに膨大なデータを追加する必要があり、iOS でその機能を実行する方法を提案する必要があります。サーバーから iPhone SQLite データベースに約 1 GB のデータを同期する必要があります。

iOS 側のデータベースに高速データを保存する別の方法が必要です。1つずつデータを保存しようとしましたが、データの同期と保存に時間がかかりすぎています。

4

1 に答える 1

5

このスタックオーバーフローの質問を読むことをお勧めします:

SQLite のパフォーマンスを向上させるにはどうすればよいですか?

これは、一般的に SQLite のパフォーマンスを改善する方法を徹底的に調べたものであり、iOS で 100,000 レコードを SQLite データベースに挿入しようとして速度の問題に遭遇したときに非常に役立ちました。

具体的には、トランザクションを使用すると、全体的な挿入速度が大幅に低下します。以下にサンプル コードの短いブロックを示します。

const char *dbpath = [[Utilities pathInDocumentsFolder: MY_DATABASE] UTF8String];
const char *sql = "INSERT INTO Filters (Region, District, Territory) " \
    "VALUES (?, ?, ?)";
sqlite3 *mapDB;
char *sqliteError;

sqlite3_stmt *insertStatement;

sqlite3_open(dbpath, &mapDB);

sqlite3_exec(mapDB, "BEGIN TRANSACTION", NULL, NULL, &sqliteError);

if (sqlite3_prepare_v2(mapDB, sql, -1, &insertStatement, NULL) == SQLITE_OK) {
    for (NSArray *row in filtersArray) {
        sqlite3_bind_text(insertStatement, 1, [[row objectAtIndex: 0] UTF8String], -1, SQLITE_TRANSIENT);  // Region
        sqlite3_bind_text(insertStatement, 2, [[row objectAtIndex: 1] UTF8String], -1, SQLITE_TRANSIENT);  // District
        sqlite3_bind_text(insertStatement, 3, [[row objectAtIndex: 2] UTF8String], -1, SQLITE_TRANSIENT);  // Territory

        if (sqlite3_step(insertStatement) != SQLITE_DONE) {
            break;
        }

        sqlite3_clear_bindings(insertStatement);
        sqlite3_reset(insertStatement);
    }
}

sqlite3_exec(mapDB, "END TRANSACTION", NULL, NULL, &sqliteError);

sqlite3_finalize(insertStatement);

sqlite3_execwithステートメントBEGINとステートメントはEND TRANSACTION魔法です。

于 2013-06-28T13:29:33.660 に答える