Android - 加快在数据库中插入数据的速度

2023-12-02

我目前有一个 CSV 文件,我正在解析该文件,并尝试将数据插入到 android 数据库中。我遇到的问题是插入所有数据花费的时间太长。数据量很大,但我觉得不需要 20 分钟左右就能完成。

基本上,我创建数据库,然后开始解析。在解析每个单独的 CSV 行时,我获取所需的数据并将其插入数据库中。总共大约有 40000 行。

有什么办法可以加快这个过程吗?我尝试过批量插入,但它从来没有真正帮助过(除非我做错了)。

代码如下。

Thanks.

数据库助手(我有两个基于每个 csv 行中的数据量的插入命令):

// add zipcode
    public void add9Zipcode(String zip, String city, String state, String lat,
            String longi, String decom) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{

            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

        db.close();

    }

    public void add12Zipcode(String zip, String city, String state, String lat,
            String longi, String decom, String tax, String pop, String wages) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{
            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);
            values.put(KEY_TAX, tax);
            values.put(KEY_POP, pop);
            values.put(KEY_WAGES, wages);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally{
            db.endTransaction();  
        }


        db.close();
}

解析文件:

public void parse(ArrayList<String> theArray, DatabaseHandler db) {

        String[] data = null;

        // while loop to get split the data into new lines
        // for loop to split each string in the array list of zipcodes
        for (int x = 0; x < theArray.size(); x++) {

            if(x == 10000 || x == 20000 || x == 30000 || x == 40000){
                Log.d(TAG, "x is 10k, 20k, 30k, 40k");
            }

            // split string first into an array
            data = theArray.get(x).split(",");

            // separate based on the size of the array: 9 or 12
            if (data.length == 9) {

                db.add9Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8]);

            } else if (data.length == 12) {

                db.add12Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8], data[9], data[10], data[11]);

                /*
                 * theZip.zip = data[0]; theZip.city = data[2]; theZip.state =
                 * data[3]; theZip.lat = data[5]; theZip.longi = data[6];
                 * theZip.decom = data[8]; theZip. = data[9]; theZip.population
                 * = data[10]; theZip.wages = data[11];
                 */

            }
        }

可以参考我之前的这个回答:在sqlite3数据库中插入1000000行

简而言之,使用InsertHelper并且每个事务执行多次插入 - 除非您做了一些奇怪的事情,否则速度的提高应该是显而易见的。

Edit:
简而言之:

  1. Your SQLiteOpenHelper应该是在整个应用程序中使用的单例。
  2. 不要四处打电话close()在你的SQLiteDatabase实例 - 它缓存在SQLiteOpenHelper每次关闭时都会强制助手重新打开它。
  3. 批量插入,在调用之外启动事务addZipCode方法并在完成所有插入后将其标记为成功 - 然后提交事务。
  4. Use an InsertHelper- 它将正确地将插入格式化为准备好的语句,并且很好且可重复使用。
  5. 请注意同步对数据库的访问 - 除非您打算在 UI 线程上完成所有数据库工作(不推荐) - 您需要启用锁定或保护对数据库的访问以避免并发访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 加快在数据库中插入数据的速度 的相关文章

  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • GridView 中多次调用 getView()

    我的 Activity 由包含 40 多个元素的 GridView 组成 开始活动后 用户最多可以看到 15 个项目 3 行 每行 5 个项目 我在 getView 正文中编写传递给获取 View 的 LogCat 编号 Log i get
  • 毕加索动画加载图像

    我有以下代码在毕加索中加载图像 使用可绘制的占位符在图像下载时显示 不过 我想要的是一个动画旋转进度条样式的旋转器 它可以在图像加载时不断地旋转 就像我在大多数专业应用程序中看到的那样 毕加索似乎不支持这一点 只支持静态图像可绘制 有没有办
  • 在 Android 中长按时从操作模式中删除后退/主页按钮

    我已经在里面长按实现了上下文操作模式recycler view 为此我打电话给ActionModeCallback从创建动作模式开始 创建动作模式时 默认显示后退箭头 检查如下 单击后退箭头 操作模式将关闭 现在我想要hide or rem
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • SQLite + SpatiaLite 问题

    我正在尝试使用 System Data SQLite 提供程序从 C 访问 SpatiaLite 当我尝试加载 SpatiaLite 扩展时 我总是得到 System Data SQLite SQLiteException SQLite e
  • 如何查看 Android 上的 Wi-Fi 是否已连接?

    我什至不希望我的用户尝试下载某些内容 除非他们连接了 Wi Fi 然而 我似乎只能判断是否启用了 Wi Fi 但他们仍然可以有 3G 连接 android net wifi WifiManager m WifiManager getSyst
  • 无法获取 Facebook 传入请求

    我正在尝试在我的 Facebook android 游戏应用程序中实现发送数据并接受该数据 我正在关注https developers facebook com docs android send requests notification
  • 为什么Android应用程序在发布到市场后尺寸会增加?

    我最近在 Android 市场上发布了我的应用程序 显示应用程序大小为 5 4MB 而实际 apk 大小为 2 8MB 为什么显示多出2MB 我应该如何限制我的应用程序大小 请帮我 您的应用程序大小会增加 因为您使用了复制保护选项ON在发布
  • java.lang.IllegalArgumentException:找不到片段的 id 0x1020002 (android:id/content) 的视图

    我正在尝试从一个片段移动到另一个片段 它在片段事务期间显示以下错误 java lang IllegalArgumentException No view found for id 0x1020002 android id content f
  • BottomSheetDialog get Behavour 始终返回 null

    我与底部表单对话框我必须获得行为才能设置setBottomSheetCallback 来处理一些事情 As 谷歌说 https android developers googleblog com 2016 02 android suppor
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Android - 如何更改 TimePicker 中的文本颜色?

    我正在使用 TimePicker 到 LinearLayout 中 背景颜色 黑色 但是 我看不到 TimePicker 中的数字 并且我需要在布局中将背景颜色设置为黑色 如何更改 TimePicker 中的 textColor 我已经尝试
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp

随机推荐

  • Postgresql sqlalchemy 默认时间 now() 一遍又一遍地给出相同的时间

    我的表内有一个字段 即时间 time db Column db Time default datetime datetime now time nullable False 由于某种原因 它一直默认为同一时间而不是实际的系统时间 23 53
  • ExtJS 4 中的股票图表

    如何绘制数百点的股票图表或折线图 我在常规折线图中禁用了动画 但没有成功 而且仍然太重且太慢 我最近写了一篇关于在 Ext JS 4 中创建股票图表的博客文章 http www scottlogic co uk 2011 12 ext js
  • JPA 中的附加查询

    我有两节课InvitedPerson and Flight彼此之间具有一对一的关系 以下是它们的注释方式 public class InvitedTech OneToOne mappedBy invitedTech cascade Casc
  • 使用 VBscript 访问 JSON 数据中的所有值

    我必须做一些 vbscript 来处理来自网络服务器的 json 格式的输出 我正在使用我发现的一个名为 aspJSON 的旧 vbscript 代码片段 我认为它来自 www aspjson com 但该网站不再可用 我有这个 JSON
  • 将小数分隔符从“,”(逗号)转换为“.” (点)例如“7,5”至“7.5”

    是的 我知道 这些是本地化设置 但我不会告诉我的客户只更改我的应用程序的本地化设置 那么如何转换这些数字呢 或者如何更改给定范围的数字格式 那里需要点 用户可以输入逗号或点 甚至是逗号分隔的数字 例如 1 000 000 00 编辑 通过
  • 相当于 HTML 中的 include()

    我想知道是否有一种方法可以仅使用 html 将一些 html 内容包含在另一个 html 中 PHP 的替代品 这可能吗 EDIT 这引起了一些混乱 我需要的是 几乎是一个 html 标签 它具有将 html 文档包含在另一个文档中的功能
  • (PySpark)reduceByKey 之后的嵌套列表

    我确信这是非常简单的事情 但我没有找到与此相关的任何内容 我的代码很简单 stream stream map mapper stream stream reduceByKey reducer 没什么特别的 输出如下所示 key1 value
  • Git Shell 中的 Meteor (mingw)

    我正在尝试为 Meteor JS 编写教程 但无法使用 Windows 版 Github 附带的 Git Shell 使其正常工作 它找不到流星命令 它在cmd中运行 并且位于Windows环境路径中 我究竟做错了什么 运行一个 bat来自
  • 滚动android时列表视图项目改变位置?

    在我的应用程序中 我使用了自定义列表视图适配器 在列表视图项中我添加了另一个布局 因为在我的服务中 一个订单有任意数量的订单项目 为了显示订单项目 我将下面的订单项目布局添加到自定义列表视图项目中 它工作正常 但是当滚动列表视图时 数据会发
  • 快速找到另一张大图像中的较小图像

    不管怎样 让这件事进展得更快 因为现在源图像大小为 1024x768 模板大小为 50x50 大约需要 6 秒 这是使用AForge 如果有人知道其他更快且更简单的方法 请提交 我想做的任务是在屏幕截图中找到较小的图像 最好快一点 我的限制
  • 赋值的左侧必须是变量、属性或索引器

    我收到错误 但不知道为什么 static void decoupeTableau IEnumerable
  • Java JApplet 到 JFrame

    我想将 JApplet 转换为 JFrame 我在互联网上找到了这个代码 它是一个单词搜索游戏 我想在课程演示中使用此代码 但我不想把它放在小程序中 我要粘贴到此处的代码大约有 7 000 个字符 我尝试采用 JApplet 并扩展 JFr
  • Julia 中的逻辑索引

    在 MATLAB 中 要删除矩阵中具有 NaN 值的所有行 我编写了以下代码 myMatrix any isnan myMatrix 2 Where any isnan myMatrix 2 返回逻辑向量 我有办法在朱莉娅做到这一点吗 我似
  • Android Studio 任务“:app:preDexDebug”执行失败[重复]

    这个问题在这里已经有答案了 我的构建应用程序正在发生这种奇怪的行为 奇怪的是 这个com nineoldandroids是一个来自android资源库的jar 我尝试删除构建源并再次重新编译 但没有成功 我的构建等级 buildscript
  • 如何修复 int.Parse 中的 ArgumentNullException?

    这是在 Mono 中运行良好的 cs 文件 using System public class HelloWorld static public void Main Console WriteLine Enter a number int
  • 函数“sleep()”的正确 #include 是什么?

    我正在使用 Big Nerd Ranch 的书 Objective C 编程 它首先让我们在前几章中用 C 编写 在我创建的一个程序中 我使用了睡眠功能 书上告诉我要放 include
  • SockJs - 未找到“信息”路径

    我正在运行一个SockJS 的示例 运行 npm install 一切正常 Start server没有问题 当我第一次加载时测试页 我看到 404 调用失败http 127 0 0 1 echo info 我正在查看 sockjs 代码
  • 如何调用Android联系人列表?

    我正在制作一个 Android 应用程序 需要调用手机的联系人列表 我需要调用联系人列表功能 选择一个联系人 然后返回我的应用程序并显示该联系人的姓名 这是我在互联网上获得的代码 但它不起作用 import android app List
  • Windows Phone 8.1 中的 AutoSuggestBox 出现奇怪的结果

    我正在尝试使用标准AutoSuggestBox在 Windows Phone 8 1 XAML 应用程序中 但它的行为非常奇怪 在一个简单的演示中 我收集了 Items new ObservableCollection
  • Android - 加快在数据库中插入数据的速度

    我目前有一个 CSV 文件 我正在解析该文件 并尝试将数据插入到 android 数据库中 我遇到的问题是插入所有数据花费的时间太长 数据量很大 但我觉得不需要 20 分钟左右就能完成 基本上 我创建数据库 然后开始解析 在解析每个单独的