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(); }
目前,我们的应用程序通过上述方法插入4000行。此方法的问题是实际执行需要10-15秒。显然,这对于简单的4000行插入来说太长了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
如何更改此方法以大大加快这些插入的执行时间?使用
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()
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
中调用该方法。也许,这可以帮助您