android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

62af96d54d6b

大家都知道,Android里数据库用的是SQLite。在实际开发过程中,我们有时候会遇到批量插入数据的场景。这篇文章给大家分享一个小技巧,让批量插入数据达到最快的目的。

首先,我先创建一个Table,里面只有一个字段:

public static final String TABLE_NAME = "demo_data";

public static final String COLUMNS_NAME = "name";

private static final String SQL_TABLE_CREATE = "create table "

+ TABLE_NAME + "("

+ COLUMNS_NAME + " text"

+ ");";

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(SQL_TABLE_CREATE);

}

然后,获取db对象:

DBHelper mDBHelper = new DBHelper(this);

SQLiteDatabase mDB = mDBHelper.getWritableDatabase();

好了,我们的准备工作做完了,接下来开始测试。

1.常规的插入方法

首先,是常规的插入操作,假设我要插入100000条数据。代码如下:

for(int i = 0 ; i < 100000 ; i++){

ContentValues values = new ContentValues();

values.put(COLUMNS_NAME, "name: " + i);

mDB.insert(TABLE_NAME, null, values);

}

在我的小米8手机上,100000条数据的插入时间大概有12秒多,非常不能接受!

2.优化的插入方法

那我们怎么优化呢?其实很简单,就是把所有的插入操作都包含在一个Transaction(事务)里:

mDB.beginTransaction();

try{

for(int i = 0 ; i < 100000 ; i++){

ContentValues values = new ContentValues();

values.put(COLUMNS_NAME, "name: " + i);

mDB.insert(TABLE_NAME, null, values);

}

mDB.setTransactionSuccessful();

}finally {

mDB.endTransaction();

}

经过这个小小的改动,插入时间大概只需要2秒多!提示了6倍多,厉不厉害!

可能有同学会问:为什么批量插入操作放在Transaction里可以把速度提示这么多?

其实原因也很简单,在Android SQLite里,对所有的写入操作(insert、update)等,都会在底层默默创建一个Transaction来完成。如果上层已经创建Transaction了(我们第二个例子),底层则不会再次创建。

所以,在我们的第一种写法里,背后还隐藏着100000次创建Transaction的操作!而第二种写法,只有一次创建Transaction的操作。把这部分开销省掉了,速度自然能大幅提示。

还能不能再快点?

其实第二种写法还有一个地方可以优化下,就是重用ContentValues对象。代码如下:

mDB.beginTransaction();

try{

ContentValues values = new ContentValues();

for(int i = 0 ; i < 100000 ; i++){

values.put(COLUMNS_NAME, "name: " + i);

mDB.insert(TABLE_NAME, null, values);

values.clear();

}

mDB.setTransactionSuccessful();

}finally {

mDB.endTransaction();

}

在循环外只创建一个ContentValues对象,然后在每次使用完之后clear掉,下次循环继续使用。

在实际测试过程中,这样还能稍微提升一点点速度,这基本上也是批量插入的最优实践了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...

自开始负责生产环境部署&#xff0c;中间遇到了若干线上环境内存以及CPU的问题。由于微服务以及容器的流行&#xff0c;现在已经可以很方便的使用 K8s prometheus grafana alert 的方式进行监控&#xff0c;这足以覆盖大部分场景。最重要的事情已经交由最适合的组件去做&…

rip协议中周期性广播路由信息的报文_技术实操||距离矢量路由协议-RIP

距离矢量路由协议—RIP01距离矢量路由协议概述路由信息协议RIP(RoutingInformation Protocol)的简称&#xff0c;它是一种基于距离矢量(Distance-Vector)算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。RIP是一种比较简单的…

使用tinylog 1.0简化您的日志记录

tinylog的大小仅为75 KB&#xff0c;是广泛使用的经典日志记录框架Log4j和Logback的轻型替代方案。 经过三年的开发&#xff0c;最终版本1.0刚刚于 3月底发布 。 在几个设计问题中&#xff0c;tinylog采取了与Java中经典日志记录框架完全不同的方法。 本文将介绍与Log4j和Logba…

华谊兄弟出现什么问题_什么是语言训练?这就要从语言问题的出现说起了

开口、发音是每一个孩子在语言发展过程中所不可少的经历&#xff0c;他们从周围环境中获取到的各种信息转化为想要表达的内容。虽然一开始孩子的语言并没有成年人那么流畅和准确&#xff0c;但随着时间的推移&#xff0c;他们的说话发音愈发成熟。只是&#xff0c;并不是所有孩…

【算法提升—力扣每日一刷】五日总结【12/18--12/22】

文章目录 2023/12/18LeetCode每日一刷&#xff1a;[20. 有效的括号](https://leetcode.cn/problems/valid-parentheses/) 2023/12/19LeetCode每日一刷&#xff1a;[150. 逆波兰表达式求值&#xff08;后缀表达式运算&#xff09;](https://leetcode.cn/problems/evaluate-rever…

CompletableFuture不能被打断

我已经写了很多有关InterruptedException和中断线程的文章 。 简而言之&#xff0c;如果您没有Future.cancel()调用Future.cancel()那么Future将终止待处理的get() &#xff0c;但还将尝试中断基础线程。 这是一个非常重要的功能&#xff0c;可以更好地利用线程池。 我还写信总…

crio电压采集 labview_NI cDAQ917采集温度方法

NI cDAQ-9171是一款由总线供电的单槽NI CompactDAQ USB机箱&#xff0c;适合较小的便携式传感器测量系统。cDAQ-9171可与50多款专用测量模块配合使用&#xff0c;用于构建模拟输出、数字I/O或计数器/定时器测量系统。这些模块适用于各种传感器测量&#xff0c;包括热电偶、RTD、…

android finish 区别,Android Activity类finish、onDestory和System.exit介绍

image.pngfinish函数Activity.finish()Call this when your activity is done and should be closed.在你的activity动作完成的时候&#xff0c;或者Activity需要关闭的时候&#xff0c;调用此方法。当调用此方法的时候&#xff0c;系统只是将最上面的Activity移出了栈&#xf…

在JVM中记录世界停顿

不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止&#xff08;STW&#xff09;暂停。 触发STW暂停的最常见原因是垃圾回收&#xff08; 例如github中的示例 &#xff09;&#xff0c;但是不同的JIT操作&#xff08; 示例 &#xff09;&#xff0c;偏向锁吊销…

jOOQ与Hibernate:何时选择哪个

Hibernate已成为Java生态系统中的事实上的标准&#xff0c;事实上&#xff0c; 如果标准对您很重要 &#xff0c;并且如果您将JCP与ISO&#xff0c;ANSI&#xff0c;IEEE等置于同一级别&#xff0c;那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#xff0…

linux怎么才能算telnet成功_怎么表白才算成功呢

要怎样表白才算成功呢&#xff1f;其实如果对方也有点喜欢你的&#xff0c;对你有点感觉的&#xff0c;不管怎样表白&#xff0c;你都会成功的&#xff0c;相反&#xff0c;如果对方本身就对你没感觉的&#xff0c;不管你要怎么轰轰烈烈的表白&#xff0c;你都不会成功。下面&a…

我们真的仍然需要32位JVM吗?

即使到了今天&#xff08;2015年&#xff09;&#xff0c;我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM&#xff1f; 我们应该有很受欢迎的意见&#xff01; 如果只需要较小的堆&#xff0c…

html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法

本文实例讲述了JavaScript实现文字与图片拖拽效果的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;JavaScript实现文字与图片的拖拽效果*{padding:0;margin:0;}.tips{position:absolute;background:#eee;}图片可以拖动脚本之家拖动链接也可以var $idfunction(id){r…

html设置页面的高度和宽度,web显示页面有图像上设置高度和宽度很重要

因此即使浏览器只有HTML&#xff0c;它仍然能够分配适当的空间。所以我们可以修改成以下内容&#xff1a;最近我们发现谷歌浏览器对图片设置有一定的修改&#xff0c;它主要在图像上进行设置width和设置height属性&#xff0c;以防止布局发生变化并改善网站访问者的体验。Web性…

磁盘空间管理工具FolderSizes

现在的硬盘已经到了用TB来计量的级别&#xff0c;但也会感觉在不知不觉间空间竟然不够用了&#xff01;到底什么东西占用了我们这么多的磁盘空间呢? 这个软件可以帮你快速进行分析。FolderSizes 企业版是一款优秀的磁盘管理工具&#xff0c;它可以有效地帮助我们快速的查看并统…

vscode修改python终端_panda3d是python的一个高级的3D 渲染和游戏开发框架

1 介绍1.1 开发维护者:迪士尼VR工作室和卡耐基梅隆娱乐技术中心。1.2 是一个3D游戏引擎和一个 3D 渲染和游戏开发库。1.3 可以在这个框架下使用 Python 和 C 。1.4 Panda3D 是开源软件&#xff0c; 它的许可证让它可以用于任何用途&#xff0c; 包括商业用途。1.5 是python的三…

HTMl和css项目总结,HTML+CSS项目开发总结

好几天没更新博客了&#xff0c;刚实战完一个HTMLCSS的简单项目。经过几天的摸索&#xff0c;发现收益良多。之前只是单纯得写demo&#xff0c;看知识点&#xff0c;没有亲自实战项目。但实战过后才会了解&#xff0c;如何才能更好地提升自己的技术。针对这次项目开发&#xff…

HDU--4768

题目&#xff1a; Flyer 原题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4768 分析&#xff1a;二分。只需要注意到最多只有一个为奇数&#xff0c;则可以首先求出学生获得的总的传单数&#xff0c;为奇数时&#xff0c;二分找到答案。 1 #include<cstdio&…

js return的值取不到_【JS基础】隐式转换(一)

开篇JS作为一门动态语言十分灵活&#xff0c;但是伴随而来的弱类型隐式转化的问题让我们十分头疼。隐式作为一个大课题&#xff0c;很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理&#xff0c;争取让你每看完一篇都会有加深对于JS隐…

语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...

数据表&#xff08;4张&#xff09;及数据情况&#xff1a;搭建数据表数据参考&#xff1a;空杯希望&#xff1a;转行数据分析师专栏&#xff08;SQL篇&#xff09;-01SQL入门​zhuanlan.zhihu.com一、表的加法1、先新建一个表course1&#xff08;和course表数据结构一致&#…