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

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

核心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();








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值