Android数据库大批量数据插入优化

简介:

对比在android中批量插入数据的3中方式对比(各插入1W条数据所花费的时间):

1、 一个一个插入



 1 public static boolean insert(SQLiteOpenHelper openHelper,
 2             RemoteAppInfo appInfo) {
 3         if (null == appInfo) {
 4             returntrue;
 5         }
 6         SQLiteDatabase db = null;
 7         try {
 8             db = openHelper.getWritableDatabase();
 9             ContentValues values = appInfo.getContentValues();
10             return -1 != db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null,
11                     values);
12         } catch (Exception e) {
13             e.printStackTrace();
14         } finally {
15             if (null != db) {
16                 db.close();
17             }
18         }
19         returnfalse;
20     }
21
22
23     for (RemoteAppInfo remoteAppInfo : list) {
24           RemoteDBUtil.insert(helper, remoteAppInfo);
25         }

耗时:106524ms,也就是106s

2、 开启事务批量插入,使用SqliteDateBase中的insert(String table, String nullColumnHack, ContentValues values)方法



 1 public static boolean insert(SQLiteOpenHelper openHelper,
 2         List list) {
 3     boolean result = true;
 4     if (null == list || list.size() <= 0) {
 5         returntrue;
 6     }
 7     SQLiteDatabase db = null;
 8
 9     try {
10         db = openHelper.getWritableDatabase();
11         db.beginTransaction();
12         for (RemoteAppInfo remoteAppInfo : list) {
13             ContentValues values = remoteAppInfo.getContentValues();
14             if (db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null, values) < 0) {
15                 result = false;
16                 break;
17             }
18         }
19         if (result) {
20             db.setTransactionSuccessful();
21         }
22     } catch (Exception e) {
23         e.printStackTrace();
24         returnfalse;
25     } finally {
26         try {
27             if (null != db) {
28                 db.endTransaction();
29                 db.close();
30             }
31         } catch (Exception e) {
32             e.printStackTrace();
33         }
34     }
35     returntrue;
36 }  


耗时:2968ms

3、 开启事务批量插入,使用SQLiteStatement


 1 public static boolean insertBySql(SQLiteOpenHelper openHelper,
 2             List list) {
 3         if (null == openHelper || null == list || list.size() <= 0) {
 4             returnfalse;
 5         }
 6         SQLiteDatabase db = null;
 7         try {
 8             db = openHelper.getWritableDatabase();
 9             String sql = “insert into “ + RemoteDBHelper.TABLE_APP_REMOTE + “(“
10                     + RemoteDBHelper.COL_PKG_NAME + “,”// 包名  
11                     + RemoteDBHelper.COL_USER_ACCOUNT + “,”// 账号  
12                     + RemoteDBHelper.COL_APP_SOURCE + “,”// 来源  
13                     + RemoteDBHelper.COL_SOURCE_UNIQUE + “,”// PC mac 地址  
14                     + RemoteDBHelper.COL_MOBILE_UNIQUE + “,”// 手机唯一标识  
15                     + RemoteDBHelper.COL_IMEI + “,”// 手机IMEI  
16                     + RemoteDBHelper.COL_INSTALL_STATUS + “,”// 安装状态  
17                     + RemoteDBHelper.COL_TRANSFER_RESULT + “,”// 传输状态  
18                     + RemoteDBHelper.COL_REMOTE_RECORD_ID // 唯一标识  
19                     + “) “ + “values(?,?,?,?,?,?,?,?,?)”;
20             SQLiteStatement stat = db.compileStatement(sql);
21             db.beginTransaction();
22             for (RemoteAppInfo remoteAppInfo : list) {
23                 stat.bindString(1, remoteAppInfo.getPkgName());
24                 stat.bindString(2, remoteAppInfo.getAccount());
25                 stat.bindLong(3, remoteAppInfo.getFrom());
26                 stat.bindString(4, remoteAppInfo.getFromDeviceMd5());
27                 stat.bindString(5, remoteAppInfo.getMoblieMd5());
28                 stat.bindString(6, remoteAppInfo.getImei());
29                 stat.bindLong(7, remoteAppInfo.getInstallStatus());
30                 stat.bindLong(8, remoteAppInfo.getTransferResult());
31                 stat.bindString(9, remoteAppInfo.getRecordId());
32                 long result = stat.executeInsert();
33                 if (result < 0) {
34                     returnfalse;
35                 }
36             }
37             db.setTransactionSuccessful();
38         } catch (Exception e) {
39             e.printStackTrace();
40             returnfalse;
41        } finally {
42             try {
43                 if (null != db) {
44                     db.endTransaction();
45                     db.close();
46                 }
47             } catch (Exception e) {
48                 e.printStackTrace();
49             }
50         }
51         returntrue;
52     }
耗时:1365ms

相关文章
|
15天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
20天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
25天前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
25天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
33 4
|
28天前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
29天前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
28天前
|
SQL Java 数据库连接
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
17 0
|
17天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
15天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
2天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为&#39;张三&#39;,`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, &#39;张三&#39;, 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES (&#39;张三&#39;, 20)`。
5 2