ios开发中必不可少的需要和数据库打交道,在少量数据插入表的时候是没有问题,但是数据量比较大的时候,就会遇到性能问题。
那怎么解决插入的效率问题呢?
- 插入语句的使用,SQLite提供了一种批量插入数据的方法,使用INSERT INTO ... VALUES ...语句插入多行数据。这样可以减少SQL语句的数量,从而提高性能。
- 使用事务:你已经提到了使用事务,这是非常重要的。确保你的插入操作在单个事务内完成,因为SQLite在事务中执行大量的插入会比在每个插入操作之后提交事务要快得多。
开启事务
[db beginTransaction];
提交事务
[db commit];
捕获异常
[db rollback];
这三个一般配合使用。
3.使用预编译的语句:在插入大量数据时,使用SQLite的预编译语句可以减少SQL解析的开销。你可以使用sqlite3_prepare_v2来准备SQL语句,然后多次执行该语句,只需要绑定不同的参数值。这可以提高性能,因为SQLite只需要编译一次SQL语句。这个sqlite已经设置的有,可以看源码。
另外数据量大的时候,不要频繁的打开和关闭数据库。
具体的源码如下:
创建一个队列
@property (nonatomic, strong) FMDatabaseQueue *queue;
初始化方法
自己创建的数据库名字,创建数据库的方法省略了。
NSString *filePath =@"数据库路径"
self.queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
用法1.
[self.queue inDatabase:^(FMDatabase *db) {
[db open];
// 开启事务,批量插入数据
[db beginTransaction];
@try {
for (NSDictionary * dic in dataArray)
{
NSArray * personArray=dic[@"personList"];
NSString * org_name=dic[@"name"];
for (NSDictionary * data in personArray) {
NSString * sqlStr=[NSString stringWithFormat:@"INSERT INTO contact (name) VALUES ('%@')",org_name];
}
}
}
@catch (NSException *exception) {
[db rollback];
}
@finally {
[db commit];
}
}];
用法2,用系统的sqlite3提供批量插入方法,建议使用此方法插入大量数据。
NSString * insertSql = @"INSERT INTO contact (name) VALUES ('%@')";
NSArray * values = [@"zzialx",@"lx",@"zzia"];
__block BOOL isSuccess = NO;
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
for (NSArray* items in values) {
isSuccess = [db executeUpdate:insertSql withArgumentsInArray:items];
if (!isSuccess) {
LogError(@"sql error [%@], code [%d], rollback! values:%@", db.lastErrorMessage, db.lastErrorCode, items);
*rollback = YES;
return;
}
}
}];
这就是sqlite3中事务的使用方法。
网友评论