zoukankan      html  css  js  c++  java
  • Android中使用LitePal操控SQLite数据库

    《第一行代码》读书手札


    (一)什么是LitePal数据库

    LitePal数据库是安卓的一个开源库,我们在以后的开发中,将会遇到许许多多的开源库,感谢开源社

    区;因为开源社区的存在,一些我们需要的功能,不再需要我们从头开始写,我们就可以直接使用;


    (二)配置LitePal

    由于LitePal是开源的第三方库。但是,我们的JDK开发包中,并没有内置这些第三方包,所有,我们

    需要配置一下;

    在Android Studio中,引用第三方库特别简单,只需要在app/build.gradle文件中声明需要使用的

    开源库的引用即可;


    LitePal开源库的引用:

    compile ‘org.litepal.android:core:1.3.2’

     将引用写到图中所示位置
    

    引用开源库:(按照图中标准的数字序号,注意配置过程中,需要联网

    这里写图片描述


    配置litepal.xml文件

    在app/src/main目录下,创建一个assets目录;创建方法New——>Directory,将这个文件夹命名

    为assets,然后在assets目录下新建一个litepal.xml文件;(一般都没有现成的xml选项,这里我们

    就选择新建File文件,在起名字的时候,写上后缀xml,即是一个xml文件)

    在该xml文件中写上如下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
        <dbname value="BookStore"></dbname>
    
        <version value="1"></version>
    
        <list></list>
    
    </litepal>

    简单说明一下:


    1. < dbname> 标签用于指定数据库的名字
    2. < version> 标签用于指定数据库的版本号
    3. < list> 标签用于所有的映射模型,稍后才会用户


    最后再修改 AndroidManifest.xml 的代码

    在< application>标签里面加上一句:

    android:name="org.litepal.LitePalApplication"

    这里写图片描述


    现在,我们就可以在项目中使用LitePal了,至此我们就可以运用面向对象的思想

    操控数据库了!

    创建,升级,增删改查,这些动作都是数据库的吗?答案是肯定的!那么,数据

    库自己应该最清楚这些操作,怎么来执行。这就是面向对象的思想的体现。



    (三)创建和升级数据库

    在这之前,在安卓中创建数据库,需要自己写一个数据库帮助类,继承SQLiteOpenBasedata类,在复
    
    写onCreate()等方法;不知你们觉得繁琐与否,反正我觉得很烦;
    

    a.先创建一张Book表

            之前,我们创建表,需要我们自己去写数据库建表语句;万一,我们要 不会写

    SQL语句怎么办呢?是不是很尴尬! 现在,救星来了——LitePal开源库。从此可以和

    SQL说再见了!(但是SQL,最好还是掌握)


    *使用LitePal 建表


    1.先写一个JavaBean;表的名字,就是Javabean的名字、表的字段,就是javabean

    的属性;属性和表的列,现在就是一一对应的,这也是对象关系映射的体现。

    每张表都对应一个Model模型类

    不知道什么是Javabean的童鞋,自己去面壁。
    
    这里只有private字段,才会被映射到数据库的表中
    
    其中id,id相当于LitePal中的关键字了,无论你设置有否,它都是默认增长的,就是主键;
    

    代码:

    /**
     * JavaBean,就是一个类,用来保存数据的;
     * 可以记为:为自己的字段,提供了get或set方法;
     * Created by Allbet on 2017/10/31.
     */
    
    public class Book {
       private int id ;
       private String name;
       private String author ;
       private float price ;
       private int pages ;
    
        public void setId(int id) {
            this.id = id;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public void setPrice(float price) {
            this.price = price;
        }
    
        public void setPages(int pages) {
            this.pages = pages;
        }
    
        public int getPages() {
            return pages;
        }
    
        public int getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public float getPrice() {
            return price;
        }
    }

    2.将写好的javaBean类添加到映射关系模型中,就是之前我们说的litepal.xml文件

    的list标签里面。使用< mapping>标签配置映射模型的Javabean类

    代码:

    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
    <!--数据库的名字-->
    <dbname value="BookStore"></dbname>
    <!--数据库的版本号-->
    <version value="1"></version>
    
    <list>
        <!--这里的class中,必须写上包的完整名称-->
        <mapping class="allbet.memory.cn.keepnamepass.Book"></mapping>
    </list>
    </litepal>
    以后不管有N多Javabean类需要配置,都是这样配置的。
    

    3. 调用Connector的getDatabase( )方法

    Connector类是LitePal库中的类
    

    代码:

    仅仅给出关键代码,代码太长了;这里是写在一个按钮监听器中;
    
     btn_createSql.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    //                使用LitePal创建数据
    //                就是一句话的事
                    Connector.getDatabase() ;
                }
            });

    到此数据库,就创建完成;并且,我们刚刚添加到litepal.xml的关系映射模型的Javabean类,也被当做表创建出来了;
    怎么样呢?是不是,不需要我们去写自己的数据库帮助类,也不需要去写SQL的建表语句了;


    有个很神奇的地方:

        之前我们升级数据库的时候,比如:为表增加一列,我们有两种做法,一种是先删除,再新建;另一种则是为了保存数据,需要一张中间的临时表,用来保存数据;

        但是在litepal中,一切都变了 ! 时移世易,那就是,只管改动你想要改动的内容,其他的我(LitePal)替你做了;比如:想要在表中增加新的列,那么就去对应的JavaBean类中添加字段,然后再次执行getDatabase()方法,即可;LitePal自己会自动保存数据,也不会出现表已经存在的错误;假如要添加添加新的表,就将新表对应的JavaBean配置到list标签下,上面的操作,都要记得更新下数据库的版本号;

        简单理解为:增加新的字段就去修改对应的Javabean;增加新的表,就去配置新写的javaBean类;

        如果还在想,为什么这样直接添加字段会对吗,数据库中已经存在这样表了等问题;笔者建议,忘记之前学的SQLiteDatabase吧,投入LitePal的怀抱啊



    (四)使用LitePal进行CRUD操作

    使用LitePal进行CRUD操作的时候,需要让代表表的JavaBean类继承自DataSupport ;


    添加数据

    1.新建一个javaBean的实例

    2.调用实例的方法,将数据添加到实例中

    3.调用继承来的save()方法;

    代码:

    //                添加数据
                    Book book = new Book() ;
    //               添加数据
    //               无论,怎么设置id,id都会自动增长
                    book.setId(1);
                    book.setName("第一行代码");
                    book.setAuthor("郭霖");
                    book.setPages(590);
                    book.setPrice(59.00f);
    //                调用save()方法
                    book.save();

    可以看出,即使代码中我们设置id一直为1,但是不会起作用的;

    因为LitePal,把id当成关键字了,当成主键,即使你不写id字段,也会自动添

    加;

    这里写图片描述



    更新数据
    最简单的方法:对已经存储的对象,重新赋值
    已经存储的对象 : 在LitePAL中,判断对象是否已经存储,根据model.isSave()方法 来判断的 ;
    只有两种情况下可以返回的true;
    1.一种是调用了model.isSave()方法,此时model会被认为是已存储的对象;
    2.model对象是通过LitePal的API查出来的;

    代码:我们目前只能使用第一种方法;

    API后面才会学习
    
    //                更新数据
                    Book book = new Book() ;
    //                没有赋值的列,会被自动赋默认值
    //                就是java中类型的默认值
                    book.setPrice(12.3f);
                    book.save() ;
    //                这里book是之前已经存储的对象了
    //                因此,再次设置价格,就是更新价格
                    book.setPrice(20.2f);
                    book.save() ;

    图中可以看出价格的确被更新了,至于为什么不是20.2,而是后面多了一些奇怪

    的东西;是因为计算机的精确度问题,就是一加一,要是精度都显示出来,结果

    其实是2.00000242871 什么的;

    这里写图片描述

    可以看出来,这样更新数据,很有局限性;如果我们想更新任何任何对象呢?使用下

    面的方法


    代码:灵活点的写法

    其中假如要将某些列,更新为默认值的时候,调用setDefault(列名)
    
                    Book book = new Book() ;
                    book.setPrice(12f);
                    book.setName("肥嘟嘟左卫门");
                    book.setPages(2);
                    book.setAuthor("蜡笔小新");
    //                更新数据,如果不写参数,则更新所有所有数据
    //                这里更新作者是郭霖的列
                    book.updateAll("author=?","郭霖") ;

    1255621959

    可以看出数据已经得到更新;


    (三)使用LitePal删除数据

    有两种方法:

    1. 调用已存储对象的delete()方法 ;

        什么是已存储对象,之前讲过,不再重复演示
    

    2. DataSupport类的静态方法deleteAll( )方法;

    不写参数,删除表中所有数据;
    

    代码:

    //                删除数据,deleteAll()不再是实例方法,而是DataSupport类的静态方法了
    //                原因很简单,删除数据,不需要实例存在
    //                更新数据,需要实例来指定数据
    //                第一个参数:指定删除的表,也就是对应的JavaBean类
    //                后面是一个:变长参数;用于指定约束条件
    //                不知道约束条件,就会删除表中的所有数据
    
    //      删除id在12-22之间,价格大于10的书
                    DataSupport.deleteAll(Book.class, "id > ? AND id<?  AND price>?", "12","22","10");

    这里写图片描述


    (四)使用LitePal查询数据

    1、 使用findAll( 表名);(查询表中所有数据)

    将返回一个list<Javabean1类型>集合,集合中包含着查询到的数据
    
    因此,拿出数据,也很简单了;可以使用加强for循环 - - foreach
    

    代码:

     List<Book> list = DataSupport.findAll(Book.class) ;
    
                    for(Book book:list){
                        //获取数据即可
                    }

    2、 根据条件查询语句(还是返回list集合

    select、where、参数都是变长参数,参数亦是约束条件


    下面为select的源代码,可以看出参数确实是变长参数

    public static synchronized ClusterQuery select(String... columns) {
            ClusterQuery cQuery = new ClusterQuery();
            cQuery.mColumns = columns;
            return cQuery;

    select( )方法:

    DataSupport.select(变长参数).find(表名)

    where方法:

    DataSupport.where(变长参数).find(表名)
    

    order( )方法:

    DataSupport.where(列名+desc/asc).find(表名)
    
    desc是降序排列,不写或者asc是升序
    

    limit()方法:

    DataSupport.limit(int).find(表名)
    
    指定查询的数据的条数,从第一条开始计算
    
    DataSupport.limit(3).find(表名) :当前查询1-3条数据
    

    offset()方法:

    DataSupport.limit(int).offset(int).find(表名)
    
    指定指定查询的数据的条数的偏移量
    
    DataSupport.limit(3).offset(2).find(表名) :当前查询数据为 3-5条
    

    最厉害的是,上面的语句可以连缀起来使用:(用 . 连缀)

    DataSupport.select("name","price")
               .where("id>?","3")
               .order("id desc")
               .limit(3)
               .offset(2)
               .find(Book.class) ;
    
    查询的数据:Book表中id大于3,的第3-5条数据,按照降序排列
    
  • 相关阅读:
    CF754A
    快速幂模板
    循环-21. 求交错序列前N项和(15)
    循环-20. 猜数字游戏(15)
    循环-19. 币值转换
    循环-18. 龟兔赛跑(20)
    循环-17. 简单计算器(20)
    循环-11. 水仙花数(20)
    IO 分支 循环
    check list
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665751.html
Copyright © 2011-2022 走看看