数据库操作:
1.使用事务进行批量数据操作:
数据库操作的本质是对磁盘文件的操作,频繁操作文件是一个耗时操作,影响数据库的存取速度。使用事务会降低数据库文件的开关频率,从而节约操作时间:
普通方式:
public void insertMemberListNormal(List<MemberModel> memberModelList){
int size = memberModelList.size();
for (int i = 0;i < size;i++){
ContentValues contentValues = new ContentValues();
contentValues.put(DBConfig.MEMBER_ID,memberModelList.get(i).getMemberId());
contentValues.put(DBConfig.MEMBER_NAME, memberModelList.get(i).getName());
db.insert(DBConfig.TAB_MEMBER_NAME, null,contentValues);
}
}
事务方式:
public void insertMemberListWithTransaction(List<MemberModel> memberModelList){
db.beginTransaction();
try {
int size = memberModelList.size();
for (int i = 0;i < size;i++){
ContentValues contentValues = new ContentValues();
contentValues.put(DBConfig.MEMBER_ID,memberModelList.get(i).getMemberId());
contentValues.put(DBConfig.MEMBER_NAME, memberModelList.get(i).getName());
db.insert(DBConfig.TAB_MEMBER_NAME, null, contentValues);
}
db.setTransactionSuccessful();
}catch (Exception e){
e.printStackTrace();
}finally {
db.endTransaction();
}
}
测试:
MemberDBService memberDBService = new MemberDBService(this);
ArrayList<MemberModel> memberModelList= new ArrayList<>();
for(int i = 0;i < 100;i++){
MemberModel memberModel1 = new MemberModel();
memberModel1.setName("lxfeng"+i);
memberModel1.setMemberId(i + "");
memberModel1.setAge(24);
memberModelList.add(memberModel1);
}
long startTimeTransaction = System.currentTimeMillis();
memberDBService.insertMemberListWithTransaction(memberModelList);
long endTimeTransaction = System.currentTimeMillis();
Log.e(TAG, "transaction insert time:" + (endTimeTransaction - startTimeTransaction));
long startTimeNomal = System.currentTimeMillis();
memberDBService.insertMemberListNormal(memberModelList);
long endTimeNormal = System.currentTimeMillis();
Log.e(TAG,"normal insert time:" + (endTimeNormal - startTimeNomal));
结果:
MainActivity﹕ transaction insert time:26
MainActivity﹕ normal insert time:717
对比发现使用事务进行批量操作消耗的时间远远小于正常操作。
2.尽量使用sqliteOpenHelper.getReadableDatabase()连接数据库。getWritableDatabase()以读写的方式连接数据库,若数据库磁盘已满,将无法写入,会报错;而getReadableDatabase()先已读写的方式连接数据库,若数据库磁盘空间已满,便改为以只读的方式打开。