Android—数据库操作之LitePal

此篇为个人学习所用。

LitePal是一个开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平常所用到的一些数据库功能进行了封装,使得不用编写一行SQL语句,就可以完成各种建表和增删改查的操作。
其开源地址:https://github.com/LitePalFramework/LitePal
具体接受和用法,我们可以访问以上链接查看。

LitePal配置

目前,我们要在android项目上即成开源库的话也是相当简单,大多数的开源项目都会提交到jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以。

implementation 'org.litepal.android:java:3.0.0'

然后配置litepal.xml文件(在app/src/main目录下新建一个litepal.xml文件),并编辑内容为:

<?xml version="1.0" encoding="utf-8"?>

<litepal>

//数据库名称
    <dbname value = "BookStore"> </dbname>
// 数据库版本
    <version value = "1"> </version>

//用于指定所有的映射模型
    <list>
    </list>
</litepal>

同时修改AndroidManifest.xml文件中的内容,<application>
下增加内容

   android:name="org.litepal.LitePalApplication"

到此,所有的LitePal的配置工作都已经结束了。

数据库创建与升级

我们还拿上篇的一个例子。定义一个类Book类,继承自LitePalSupport,声明一些属性,并实现其getter和setter方法。

public class Book  extends LitePalSupport{

    private int id;

    private String auther;
。。。。。。

    public void setId(int id) {
        this.id = id;
    }

    public void setAuther(String auther) {
        this.auther = auther;
    }
。。。。。。
    public int getId() {
        return id;
    }

    public String getAuther() {
        return auther;
    }
。。。。。。
}

其实Book类就对应一个Java bean。其实Book类就对应数据库当中的Book表。
然后我们修改litepal.xml文件,在list标签下增加:

    <list>
        <mapping class = "com.example.adiqueen.litepaltest.Book"></mapping>

    </list>

这里使用<mapping>来声明我们要配置的映射模型类,注意一定要是完成的类名,不管有多少的模型类需要映射都适用同样的方式配置在list标签下即可。现在只要进行任何一次数据库相关的操作,BookStore.db数据库就会自动的创建出来。

然后触发一个事件调用Connector.getDatabase()方法,该方法就是一次简单的数据库操作,执行这个方法之后 BookStore数据库就创建完成了。

数据库的升级

如果数据库不能满足我们的需要了,需要作出改进。例如:Book类需要增加字段,或者需要增加一张别的表,在这里假设我们要增加一张Category的表。该怎么升级呢?
步骤很简单:
1、在Book类中增加相应的字段,创建类似于Book的Category类。
2、修改litepal.xml文件内容,将version表示的版本增加,list中添加映射关系。

<?xml version="1.0" encoding="utf-8"?>

<litepal>
    <dbname value = "BookStore"> </dbname>
    <version value = "2"> </version>
    <list>
        <mapping class = "com.example.adiqueen.litepaltest.Book"></mapping>
        <mapping class = "com.example.adiqueen.litepaltest.Category"></mapping>
    </list>

</litepal>
使用LitePal实现数据库的增 删 改 查

其具体实现逻辑在此不作过多的叙述,直接看实现代码吧。

        //增加数据
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Book book = new Book();

                book.setName("C语言");
                book.setAuther("Json");
                book.setPages(330);
                book.setPrice(39.9);
                book.setPress("北京人民教育出版社");

                book.save();//添加一条数据

                /*
                * 同一个bean存过一次后再存就会存储失败
                * */

                //对象是否存储过
                //Boolean isSave = book.isSaved();

                //book.saveAsync();//异步保存

                //book.saveThrows();
                //如果希望存储失败的话就抛出异常,而不是返回一个false,那就可以使用saveThrows()方法来代替。
                //使用saveThrows()方法来存储数据,一旦存储失败就会抛出一个DataSupportException异常,我们可以通过对这个异常进行捕获来处理存储失败的情况。

                //book.saveOrUpdate("name = ?" ,book.getName());//不存在就存储,已存在就更新的需求

            }
        });



        //更新数据的另一种方式
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                Book book = new Book();
                //在这里调用setPrice()和setPress()来设置要更新的数据
                //调用updateAll()方法来执行更新
                book.setPrice(14.95);

                book.setPress("Gagaga");

                book.updateAll("name = ? and auther = ?" ,"数据结构","Liu Gaojian");


                //如果我们想要把一个字段的值全部更新为默认值,可以使用一下方式
                book.setToDefault("price");
                book.updateAll();



                //第一步,查找id为1的记录
                Book book1 = LitePal.find(Book.class,1);

                //第二步,改变某个字段的值
                book1.setPages(300);

                //保存数据
                boolean isSaveSuccess= book1.save();

                if (isSaveSuccess){
                    //修改完成
                }else {
                    //修改失败
                }


                Book book2 = new Book();

                book2.setName("操作系统");

                //直接更新id为1的记录
                book2.update(1);

                boolean isSaveSu = book2.save();

                if (isSaveSuccess){
                    //修改完成
                }else {
                    //修改失败
                }



                Book book3 = new Book();

                book3.setPress("HHHHHHHH");

                //将所有name为C语言的数据,press全部改成HHHHHHHH
                book3.updateAll("name = ?","C语言");


                Book book4 = new Book();

                book4.setPress("HHHHHHHH");

                //将所有name为C语言的、pages为300数据,press全部改成HHHHHHHH
                book4.updateAll("name = ? and pages = ?","C语言","300");
                
            }
        });

        //删除数据数据
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //条件删除
                LitePal.deleteAll(Book.class,"price < ?","15");

                //返回值是int,表示删除了几条数据,返回0表示没有删除
                //int isdelect= LitePal.deleteAll(Book.class);
                
            }
        });



        //查询数据
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {



                //通过id查询
                Book book_ = LitePal.find(Book.class,1);


                //查询全部
                List<Book> books = LitePal.findAll(Book.class);

                for (Book book : books){

                    Log.d("GGGGGGG",book.getName().toString());

                }

                //根据姓名查找,并按照某字段排序
                List<Book> books_ = LitePal.where("name = ?","Liu gaojian").order("price").find(Book.class);

                for (Book book : books_){

                    Log.d("GGGGGGG",book.getName().toString());

                }

                
                //查price小于30
                List<Book> book_s_ = LitePal.where("price < ?","30").find(Book.class);
                for (Book book : book_s_){

                    Log.d("GGGGGGG",book.getName().toString());

                }
            }
        });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345