关于ios:在SQLite中存储大量数据

Store huge data in SQLite

本问题已经有最佳答案,请猛点这里访问。

我必须在sqlite数据库中添加大量数据,并需要一些建议,如何在iOS中实现这些功能。我必须将大约1 GB的数据从服务器同步到iPhone SQLite数据库。

我需要其他方法来在iOS端的数据库中存储快速数据。我试过逐个存储数据,但同步和存储数据花费了太多时间。


我建议您阅读这个堆栈溢出问题:

如何提高sqlite的性能?

这是一个非常仔细的了解如何提高一般sqlite的性能,当我遇到速度问题,试图将100000条记录插入到iOS的sqlite数据库时,这是非常有帮助的。

具体来说,事务的使用大大降低了整体插入速度。下面是一小段示例代码,您可以看到我的意思:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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);

带着BEGINEND TRANSACTION语句的sqlite3_exec是魔力。