Android 如何提高SQLite性能?
我想在androidsqlite中插入3000多条记录,但是下面的代码需要花费很多时间来插入数据 这是我的密码Android 如何提高SQLite性能?,android,performance,sqlite,Android,Performance,Sqlite,我想在androidsqlite中插入3000多条记录,但是下面的代码需要花费很多时间来插入数据 这是我的密码 public boolean addSale(Sale objSale) { ContentValues values = new ContentValues(); values.put(SALE_BRANCH, objSale.getBranch()); values.put(SALE_SUPPLIER, objSale.getSupplier());
public boolean addSale(Sale objSale) {
ContentValues values = new ContentValues();
values.put(SALE_BRANCH, objSale.getBranch());
values.put(SALE_SUPPLIER, objSale.getSupplier());
values.put(SALE_BUYER, objSale.getBuyer());
values.put(SALE_CAT1, objSale.getCat1());
values.put(SALE_CAT2, objSale.getCat2());
values.put(SALE_CAT3, objSale.getCat3());
values.put(SALE_CAT4, objSale.getCat4());
values.put(SALE_CAT5, objSale.getCat5());
values.put(SALE_CAT6, objSale.getCat6());
values.put(SALE_DESIGNO, objSale.getDesigNo());
values.put(SALE_ITEMSIZE, objSale.getItemSize());
values.put(SALE_SALEQTY, objSale.getSaleQty());
values.put(SALE_STOCKQTY, objSale.getStockQty());
values.put(SALE_FinalProduct, objSale.getFinalProduct());
values.put(SALE_PriceRange, objSale.getPriceRange());
values.put(SALE_CoreNonCore, objSale.getCoreNonCore());
values.put(SALE_Color, objSale.getColor());
values.put(SALE_GSLCode, objSale.getGSLCode());
values.put(SALE_Wanted, objSale.getWanted());
values.put(SALE_Pqty, objSale.getPqty());
values.put(SALE_MRP, objSale.getMRP());
values.put(SALE_PRate, objSale.getPRate());
SQLiteDatabase db = this.getWritableDatabase();
db.insert(TABLE_SALE, null, values);
db.close();
return true;
}
这是我的任务。我从webservice获取数据并插入SQLite
protected void onPostExecute(String result)
{
try {
String l = result.replace("\\", "");
l = l.replace("''", "");
String sdsd = l.substring(1, l.length() - 1);
JSONArray jsonArray = new JSONArray(sdsd);
Log.i("JSON", "Number of surveys in feed: " +jsonArray.length());
/*if(db.delSaleData()){
}*/
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
sl.setBranch(jsonObject.getString("Branch"));
sl.setSupplier(jsonObject.getString("Supplier"));
sl.setBuyer(jsonObject.getString("Buyer"));
sl.setCat1(jsonObject.getString("Cat1"));
sl.setCat2(jsonObject.getString("Cat2"));
sl.setCat3(jsonObject.getString("Cat3"));
sl.setCat4(jsonObject.getString("Cat4"));
sl.setCat5(jsonObject.getString("Cat5"));
sl.setCat6(jsonObject.getString("Cat6"));
sl.setDesigNo(jsonObject.getString("DesigNo"));
sl.setItemSize(jsonObject.getString("ItemSize"));
sl.setSaleQty(jsonObject.getString("SaleQty"));
sl.setStockQty(jsonObject.getString("StockQty"));
sl.setFinalProduct(jsonObject.getString("FinalProduct"));
sl.setPriceRange(jsonObject.getString("PriceRange"));
sl.setCoreNonCore(jsonObject.getString("CoreNonCore"));
sl.setColor(jsonObject.getString("Color"));
sl.setGSLCode(jsonObject.getString("GSLCode"));
sl.setWanted(jsonObject.getString("Wanted"));
sl.setPqty(jsonObject.getString("Pqty"));
sl.setMRP(jsonObject.getString("MRP"));
sl.setPRate(jsonObject.getString("PRate"));
if(db.addSale(sl))
{
//Toast.makeText(getApplicationContext(), " Insert.." , Toast.LENGTH_SHORT).show();
}
}
setData();
} catch (Exception e) {
e.printStackTrace();
}
dialog.dismiss();
setTableData("All");
}
受保护的void onPostExecute(字符串结果)
{
试一试{
字符串l=结果。替换(“\\”,“”);
l=l。替换(“”,“”);
字符串sdsd=l.substring(1,l.length()-1);
JSONArray JSONArray=新JSONArray(sdsd);
Log.i(“JSON”,“提要中的调查数量:”+jsonArray.length());
/*if(db.delSaleData()){
}*/
for(int i=0;i
使用Async
类。在后台执行操作,而不是在主UI线程中
更新
在代码中,您可以通过
onPost
而不是onBackground
插入SQLiteonPost
在UI线程上执行操作,而onBackground
在单独的(后台)线程上执行操作,这样就不会影响UI。因此,将操作代码移动到onBackground
不要每次插入时都打开和关闭数据库。打开它一次,然后在退出应用程序时关闭它。使用SQLITE语句,例如:
private void bulkInsertRecords(String[] records) {
String sql = "INSERT INTO "+ SAMPLE_TABLE_NAME +" VALUES (?,?,?);";
SQLiteStatement statement = sampleDB.compileStatement(sql); //Este é o prepare
sampleDB.beginTransaction();
for (int i = 0; i<records.length; i++) {
statement.clearBindings();
statement.bindString(1, records[0]);
statement.bindString(2, records[1]);
statement.bindString(3, records[2]);
statement.execute();
}
sampleDB.setTransactionSuccessful();
sampleDB.endTransaction();
}
private void bulkInsertRecords(字符串[]记录){
字符串sql=“插入到“+样本表名称+”值(?,?);”;
SQLiteStatement语句=sampleDB.compileStatement(sql);//Esteéo prepare
sampleDB.beginTransaction();
对于(int i=0;我是如何提高SQLite性能的?是的。。所有的插入都是在Asynk任务中执行的。@user3249477是的,它使UI线程像往常一样运行,这样用户就不会注意到您正在插入DB。记住,我们在这里谈论的是数千行。@user1690714也请发布异步代码,也许我们可以在那里找到一些东西。@BlazeTama您没有“没有回答我的问题。只是说用户不会注意到,这并不意味着SQLite的性能有所提高。请检查此项..您仅在应用程序首次启动时执行此项操作一次吗?此项是否有任何错误..如果没有,那么为什么投反对票?+1,您也应该检查此项。这是否会加快速度?真的…它会加快数据插入速度..是的,但是”t阅读此链接以获取更多信息是的,它确实使其更快。每个事务都是一个打开和关闭的文件。为每个插入执行此操作的成本非常高。