Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite-在Android应用程序中加速4000行插入 public synchronized void updateStop(ArrayList beanList){ SQLiteDatabase db=getWritableDatabase(); String query=“从“停止”删除”; execSQL(查询); for(StopBean:beanList){ 字符串atco_code=bean.getAtco_code(); String name=bean.getName(); String locality=bean.getLocality(); String-bearing=bean.getBearing(); 字符串纬度=bean.getLatitude()+“”; 字符串经度=bean.getLongitude()+“”; ContentValues=新的ContentValues(); 值。put(“atco_代码”,atco_代码); 值。put(“名称”,名称); 价值。放置(“位置”,位置); 值。放置(“轴承”,轴承); 值。put(“纬度”,纬度); 值。输入(“经度”,经度); db.插入(“停止”,空,值); } db.close(); }_Java_Android_Sqlite - Fatal编程技术网

Java SQLite-在Android应用程序中加速4000行插入 public synchronized void updateStop(ArrayList beanList){ SQLiteDatabase db=getWritableDatabase(); String query=“从“停止”删除”; execSQL(查询); for(StopBean:beanList){ 字符串atco_code=bean.getAtco_code(); String name=bean.getName(); String locality=bean.getLocality(); String-bearing=bean.getBearing(); 字符串纬度=bean.getLatitude()+“”; 字符串经度=bean.getLongitude()+“”; ContentValues=新的ContentValues(); 值。put(“atco_代码”,atco_代码); 值。put(“名称”,名称); 价值。放置(“位置”,位置); 值。放置(“轴承”,轴承); 值。put(“纬度”,纬度); 值。输入(“经度”,经度); db.插入(“停止”,空,值); } db.close(); }

Java SQLite-在Android应用程序中加速4000行插入 public synchronized void updateStop(ArrayList beanList){ SQLiteDatabase db=getWritableDatabase(); String query=“从“停止”删除”; execSQL(查询); for(StopBean:beanList){ 字符串atco_code=bean.getAtco_code(); String name=bean.getName(); String locality=bean.getLocality(); String-bearing=bean.getBearing(); 字符串纬度=bean.getLatitude()+“”; 字符串经度=bean.getLongitude()+“”; ContentValues=新的ContentValues(); 值。put(“atco_代码”,atco_代码); 值。put(“名称”,名称); 价值。放置(“位置”,位置); 值。放置(“轴承”,轴承); 值。put(“纬度”,纬度); 值。输入(“经度”,经度); db.插入(“停止”,空,值); } db.close(); },java,android,sqlite,Java,Android,Sqlite,目前,我们的应用程序通过上述方法插入4000行。此方法的问题是实际执行需要10-15秒。显然,这对于简单的4000行插入来说太长了 如何更改此方法以大大加快这些插入的执行时间?使用beginTransaction()、endTransaction()和MarkTransactionAssessful()将整个事务包装到事务中。现在,每次插入一个事务,这意味着每次插入一个磁盘I/O脉冲,这将非常缓慢 除此之外: 不要在循环的每个过程中分配新的ContentValues 去掉局部变量(例如,atc

目前,我们的应用程序通过上述方法插入4000行。此方法的问题是实际执行需要10-15秒。显然,这对于简单的4000行插入来说太长了


如何更改此方法以大大加快这些插入的执行时间?

使用
beginTransaction()
endTransaction()
MarkTransactionAssessful()
将整个事务包装到事务中。现在,每次插入一个事务,这意味着每次插入一个磁盘I/O脉冲,这将非常缓慢

除此之外:

  • 不要在循环的每个过程中分配新的
    ContentValues

  • 去掉局部变量(例如,
    atco_code
    ),以防它们没有被优化掉

  • 使用比“”更有效的方法将数字转换为字符串(例如,
    Double.toString()

  • 尝试将普通SQL
    INSERT
    语句编译为
    SQLiteStatement
    ,看看这是否比只调用
    INSERT()


如果您仍然不满意,请使用Traceview并确定剩余时间将花在何处。

使用
beginTransaction()
endTransaction()
markTransactionAsSuccessful()将整个事务包装在事务中
。现在,每次插入一个事务,这意味着每次插入一个磁盘I/O脉冲,这将非常缓慢

除此之外:

  • 不要在循环的每个过程中分配新的
    ContentValues

  • 去掉局部变量(例如,
    atco_code
    ),以防它们没有被优化掉

  • 使用比“”更有效的方法将数字转换为字符串(例如,
    Double.toString()

  • 尝试将普通SQL
    INSERT
    语句编译为
    SQLiteStatement
    ,看看这是否比只调用
    INSERT()

如果您仍然不开心,请使用Traceview并确定剩余时间花在哪里。

在(Kit Kat、Jelly Bean和棒棒糖)中,您可以使用多插入语句:

public synchronized void updateStop(ArrayList<StopBean> beanList){
    SQLiteDatabase db = getWritableDatabase();
    String query = "DELETE FROM 'stop'";
    db.execSQL(query);
    for(StopBean bean : beanList){
        String atco_code = bean.getAtco_code();
        String name = bean.getName();
        String locality = bean.getLocality();
        String bearing = bean.getBearing();
        String latitude = bean.getLatitude()+"";
        String longitude = bean.getLongitude()+"";

        ContentValues values = new ContentValues();
        values.put("atco_code", atco_code);
        values.put("name", name);
        values.put("locality", locality);
        values.put("bearing", bearing);
        values.put("latitude", latitude);
        values.put("longitude", longitude);
        db.insert("stop", null, values);
    }

    db.close();
}
如果要导入静态受信任的数据,请在应用程序的文件中包含包含数据的sqlite脚本,并在第一次启动时运行该脚本。注意:切勿将SQL值连接到SQL查询中,因为这样会打开数据库注入(而且也不会更快,因为您和sqlite将对数据进行两次解析,并进行不必要的重新序列化)

如果需要插入动态生成的数据,或者需要支持旧版本,则应使用准备好的语句预编译SQL查询,并使用绑定变量。例如:

INSERT INTO table (col1, col2) VALUES 
  ('row1col1', 'row1col2'), ('row2col1', 'row2col2');
在所有情况下,您都应该将所有插入内容包装在一个事务中。使用一个事务允许数据库将值缓存在快速RAM中,并仅在缓存已满或完成时刷新数据,而不是针对每个insert语句将数据刷新到永久存储中。

(即Kit-Kat、Jelly-Bean和棒棒糖)您可以使用multi-insert语句:

public synchronized void updateStop(ArrayList<StopBean> beanList){
    SQLiteDatabase db = getWritableDatabase();
    String query = "DELETE FROM 'stop'";
    db.execSQL(query);
    for(StopBean bean : beanList){
        String atco_code = bean.getAtco_code();
        String name = bean.getName();
        String locality = bean.getLocality();
        String bearing = bean.getBearing();
        String latitude = bean.getLatitude()+"";
        String longitude = bean.getLongitude()+"";

        ContentValues values = new ContentValues();
        values.put("atco_code", atco_code);
        values.put("name", name);
        values.put("locality", locality);
        values.put("bearing", bearing);
        values.put("latitude", latitude);
        values.put("longitude", longitude);
        db.insert("stop", null, values);
    }

    db.close();
}
如果要导入静态受信任的数据,请在应用程序的文件中包含包含数据的sqlite脚本,并在第一次启动时运行该脚本。注意:切勿将SQL值连接到SQL查询中,因为这样会打开数据库注入(而且也不会更快,因为您和sqlite将对数据进行两次解析,并进行不必要的重新序列化)

如果需要插入动态生成的数据,或者需要支持旧版本,则应使用准备好的语句预编译SQL查询,并使用绑定变量。例如:

INSERT INTO table (col1, col2) VALUES 
  ('row1col1', 'row1col2'), ('row2col1', 'row2col2');

在所有情况下,您都应该将所有插入内容包装在一个事务中。使用一个事务允许数据库将值缓存在快速RAM中,并仅在缓存已满或完成时刷新数据,而不是将每个insert语句的数据刷新到持久存储中。

在后台线程上运行???@iravivooda我对Java不熟悉,但我相信这段代码已经在另一个线程上运行了,类
实现了Runnable
,方法是在
override run
中调用的。也许,这可以帮助你在后台线程上运行???@iravivooda我对Java不熟悉,但我相信这段代码已经在另一个线程上运行了,类
实现了Runnable
并且在
override run
中调用该方法。也许,这可以帮助您