Android SQLite事务

介绍一个ORM框架,LitePal。
GitHub:https://github.com/LitePalFramework/LitePal
使用方法很简单,导入xx包就不说了。

  1. 创建一个类,继承DataSupport。
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()的方式。另外需要注意的是,数据插入属于耗时操作,应开启线程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,944评论 19 139
  • 前言 本文参考转发摘自:【郭霖博客】http://blog.csdn.net/guolin_blog?viewmo...
    _猜火车_阅读 11,220评论 0 10
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,642评论 18 399
  • 快要离家了,心想着能帮父亲多干点活。其实父亲本不必干那么多的活计的。他有足够的退休金,家里也都安顿好了。每次我跟他...
    飔飏阅读 1,747评论 0 0

友情链接更多精彩内容