android sql 批量处理插入/修改/删除 操作通用代码

时间:2021-09-19 21:46:50

这个就没图了,直接上代码吧:

核心java类:

package com.test.utils;//这里填写你自己的包

import java.util.ArrayList;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;


public abstract class BulkDatabase<T> {

private final String TAG = BulkDatabase.class.getSimpleName();
private String sql;
protected boolean isBulking = false;
protected ArrayList<T> list;//这里采用ArrayList而不是采用List避免向上转型影响性能,如果需要则可以改为List或其他数据结构
private Context mContext;

public BulkDatabase() {
}

public String getSql() {
return sql;
}

public void setSql(String sql) {
this.sql = sql;
}


public ArrayList<T> getList() {
return list;
}

public void setList(ArrayList<T> list) {
this.list = list;
}

//这里建议传入Application的Context避免内存泄露问题。
public BulkDatabase(String sql, ArrayList<T> list,Context context) {
super();
this.sql = sql;
this.list = list;
mContext=context;
}

/**
* 使用批量插入前一定要实现。
*
* @param stat
*/
public abstract void setStatement(SQLiteStatement stat);

/**
* 执行批量插入,请在调用钱复写setStatement方法,然后实现循环插入/删除...
*/
public synchronized void doBulk() {
Long startTime = System.currentTimeMillis();
isBulking = true;
SQLiteOpenHelper helper = new SQLiteOpenHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);//这里的传入你的数据库名称和版本。
try (SQLiteDatabase database = helper.getReadableDatabase()) {
helper.onCreate(database);
SQLiteStatement stat = database.compileStatement(sql);
database.beginTransaction();
setStatement(stat);
if (isBulking) {
database.setTransactionSuccessful();// 这里设置是否完成数据库的批量操作,如果不设置则自动回滚,也就是放弃批量操作。
}
database.endTransaction();
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG, "doBulk error:" + e.getMessage());
}
if(!isBulking){
rollBack();
}
Long endTime = System.currentTimeMillis();
Log.i(TAG, "bulk use time:" + (endTime - startTime));
}

/**
*回滚之后需要进行的操作。
*/
protected abstract void rollBack();
/**
*取消批量处理操作
*/
public void cancelBulk() {
isBulking = false;
}
public boolean isCancel(){
return !isBulking;
}
}


例子实现一个批量插入:

 private class MyInsertBulkDatabase extends BulkDatabase<FileInfo>{

@Override
public void setStatement(SQLiteStatement stat){
int number = list.size();
for(int i = 0; i < number; i++){
FileInfo fileInfo = list.get(i);//这里的FileInfo是需要你修改成你需要插入的数据信息集合
if(isBulking){
stat.bindString(1, fileInfo.fileName);//这里绑定数据
stat.executeInsert();
} else{
break;
}
}
}

@Override
protected void rollBack() {
//回滚后实现你需要的操作。
}

};


使用:

ArrayList<FileInfo> list=new ArrayList<>();//这里的FileInfo是需要你修改成你需要插入的数据信息集合
list.add(new FileInfo("test"));
MyInsertBulkDatabase mInsertBulkDatabase=new MyInsertBulkDatabase(sql,list,getApplicationContext());//这里建议放入后台线程运行。
mInsertBulkDatabase.doBulk();