Android SQLite事务

发布时间:2018-11-15  栏目:sqlite  评论:0 Comments

复制代码 代码如下:

介绍一个ORM框架,LitePal。
GitHub:https://github.com/LitePalFramework/LitePal
动用办法充分粗略,导入xx包就不说了。

 public void payment() {
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  db.beginTransaction();//开始业务
  try {
   db.execSQL(“update person set amount=amount-10 where personid=2”);
   db.execSQL(“update person set amount=amount+10 where personid=5”);
   db.setTransactionSuccessful();//
设置工作之表明吧true,调用此方法会在履行到endTransaction()方法是交由业务,若无调用此方法会在实施到endTransaction()方法回滚事务。
  } catch (SQLException e) {
  } finally {
   db.endTransaction();
  }
  // 结束工作,有少栽状况:commit,rollback,
  //
事务的付出或回滚是出于业务之表明决定的,如果工作的标志为true就会见付出,否则回滚,默认情况下业务的标志吗false
 } 

  1. 缔造一个好像,继承DataSupport。

PS:类似转账功能,两个操作以和一个工作中得。

君可能感兴趣之章:

  • Android开发被的数据库事务用法分析
  • Android
    SQLite事务处理结合Listview列表显示力量示例
  • 深入Android SQLite
    事务处理详解
  • Android
    SQLite数据库增删改查操作的施用详解
  • Android使用SQLite数据库的概括实例
  • android创建数据库(SQLite)保存图片示例
  • Android中之SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)
  • android实现raw文件夹导入数据库代码
  • Android中操作SQLite数据库快速入门教程
  • Android实现用曾经发送的差信写副短信数据库的艺术
  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解
  • Android数据库中工作操作方法之银行转账示例
public class StudentBean extends DataSupport {

    private int studentID;
    private String studentName;
    private String studentAge;
    private String studentSex;
    private String studentPhone;

    public int getStudentID() {
        return studentID;
    }

    public void setStudentID(int studentID) {
        this.studentID = studentID;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentAge() {
        return studentAge;
    }

    public void setStudentAge(String studentAge) {
        this.studentAge = studentAge;
    }

    public String getStudentSex() {
        return studentSex;
    }

    public void setStudentSex(String studentSex) {
        this.studentSex = studentSex;
    }

    public String getStudentPhone() {
        return studentPhone;
    }

    public void setStudentPhone(String studentPhone) {
        this.studentPhone = studentPhone;
    }
}
  1. assets目录下开创一个名叫也litepal.xml的布文件

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="litepal" >
    </dbname>
    <version value="3" >
    </version>
    <list>
         <mapping class="com.jeremy.universal_android.sqlite.bean.StudentBean"></mapping>
    </list>
</litepal>
  1. application继承LitePalApplication

public class UniversalAndroidApplication extends LitePalApplication {
    @Override
    public void onCreate() {
        super.onCreate();
//        初始化sqlite库
        LitePalApplication.initialize(this);
    }
}

哪些利用?

private void insertWithTs() {
    StudentBean studentBean = null;

    for (int i = 0; i < 1000; i++) {
        studentBean = new StudentBean();

        studentBean.setStudentName("小明" + i);
        studentBean.setStudentAge("" + i);

        studentBean.save();
    }
}

private void insertWithoutTs() {

    List<StudentBean> studentBeanList = new ArrayList<>();

    StudentBean studentBean = null;

    for (int i = 0; i < 1000; i++) {
        studentBean = new StudentBean();

        studentBean.setStudentName("小明" + i);
        studentBean.setStudentAge("" + i);

        studentBeanList.add(studentBean);
    }

    DataSupport.saveAll(studentBeanList);
}

题目来了,上面两独艺术同样是插1000长达数据,区别是啊为?insertWithTs()调用的凡目标的save(),执行1000浅;而insertWithoutTs()是管1000独对象在一个凑合中,最后调用平等赖saveAll()。

扣押一下片种植办法效率如何。
insertWithTs(),单位凡毫秒

E/SQLITE: begin --> 1470285148375
E/SQLITE: end --> 1470285156347
E/SQLITE: gap --> 7972

insertWithoutTs(),单位是毫秒

E/SQLITE: begin --> 1470285043075
E/SQLITE: end --> 1470285045001
E/SQLITE: gap --> 1926

差异如此之好,原因在哪?看源码
save()方法是这般的

public synchronized void saveThrows() {
    SQLiteDatabase db = Connector.getDatabase();
    db.beginTransaction();
    try {
        // some code
        db.setTransactionSuccessful();
    } catch (Exception e) {
        throw new DataSupportException(e.getMessage());
    } finally {
        db.endTransaction();
    }
}

而saveAll()呢?

public static synchronized <T extends DataSupport> void saveAll(Collection<T> collection) {
    SQLiteDatabase db = Connector.getDatabase();
    db.beginTransaction();
    try {
        //code to save collection
        db.setTransactionSuccessful();
    } catch (Exception e) {
        throw new DataSupportException(e.getMessage());
    } finally {
        db.endTransaction();
    }
}

每一样次等save()都关系到一个工作的begin和end,当数据量变大时,代码执行效率就是会明显低于saveAll()的艺术。另外要留意的凡,数据插入属于耗时操作,应开启线程。

留下评论

网站地图xml地图