Android持久化----LitePal

来源:互联网 发布:d盘格式化数据恢复 编辑:程序博客网 时间:2024/06/14 15:30

LitePal是android持久化的一个轻框架。它在保存sql语句操作方式的同时,实现了ORM。本文将简单讲述Android Studio下LitePal的使用。

分为以下几部分
(1)引入dependence
(2)添加配置文件
(3)修改Manifest中的application参数
(4)创建数据库
(5)创建表
(6)常用的增删改查
(7)数据库的更新

引入dependence

这是最基本的!网上很多帖子都说,除添加dependence外,还需要引用jar包!从实例来看,对于1.6.1版本,仅需要在gradle的dependence中添加引用即可,无需jar包。

compile 'org.litepal.android:core:1.6.1'

添加配置文件

这步比较关键。最初我也出错。
assets目录一定要创建在main目录下,而非res目录下(当然,如果熟悉gradle,可以指定配置路径。否则,老老实实在main下创建)。

这里写图片描述

而后在目录下,添加配置文件litepal.xml。

<?xml version="1.0" encoding="utf-8"?><litepal>    <dbname value="mydb"/>    <version value="1"/>    <list>        <mapping class="com.breakloop.litepaldemo.entity.Hero"/>    </list></litepal>

dbname为数据库名称,version为版本号,list中的mapping为数据库表所对应的实体类。

切记,每个与表对应的实体类都要加入list当中,否则,无法创建表。

修改Manifest中的application参数

在Manifest的application中添加android:name属性,标记该application为litepal应用。

这里写图片描述

创建数据库

在合适的位置调用如下代码即可。

LitePal.getDatabase();

创建表

由于LitePal实现了ORM,我们需要两步完成表的创建。

(1)将实体类继承org.litepal.crud.DataSupport
(2)将实体类添加到litepal.xml的mapping list中

例如,

package com.breakloop.litepaldemo.entity;import org.litepal.crud.DataSupport;/** * Created by user on 2017/12/19. */public class Hero extends DataSupport {    private int age;    private String name;    private String title;    public String getTitle() {        return title;    }    public int getAge() {        return age;    }    public String getName() {        return name;    }    public void setAge(int age) {        this.age = age;    }    public void setName(String name) {        this.name = name;    }    public void setTitle(String title) {        this.title = title;    }}

常用的增删改查

那么,如何插入一条记录呢?

仅仅需要创建一个对象,然后调用继承自DataSupport的save()方法即可。

 Hero hero=new Hero(); hero.setAge(10); hero.setName("A"); hero.setTitle("son"); hero.save();

那么,查询呢?

有了save()方法,闭着眼睛也成想到select()的存在。

List<Hero>  heroList = Hero.select("age","name","title").where("name=?","B").find(Hero.class);if(heroList.size()>0){    for (Hero item : heroList) {        Log.i(TAG, "name = "+item.getName()                  +", age = "+item.getAge()                  +", title = "+item.getTitle());    }}else {    Log.i(TAG, "Do Not find B");}

select中要提供对应的列名;
where指定查询条件匹配格式,和查询值;
find指定表所对应的实体类class。

当然,还有group,limit,order,offset等方法。

例如

List<Hero>  heroList = Hero.select("age","name","title").where("age>?","10").order("name").limit(3).offset(1).find(Hero.class);

即,从Hero表中,查询age>10的所有记录,并从该结果集合的第2条记录(offset 1)开始,取出3条记录(limit 3),同时按照name排序。

接下来,看数据库的更新。很明显,使用DataSupport的updateXXX()方法。

Hero hero = new Hero();hero.setTitle("Leader");hero.updateAll(Hero.class,"age=? and name=?","10","A");

当然,在查询后,对查询结果进行修改,然后调用实体类的save()方法,也能达到更新的效果。例如,

heroList=Hero.select("age","name","title").where("name=?","B").find(Hero.class);if(heroList.size()>0){    for (Hero item :        heroList) {        Log.i(TAG, "Update B name to B1");        item.setName("B1");        if(item.save()){            Log.i(TAG, "Update B name to B1");        }else {            Log.i(TAG, "Update B name to B1 failed");        }    }}else {    Log.i(TAG, "Do Not find B");}

最后,是删除!铁定deleteXXX方法。例如

count=Hero.deleteAll(Hero.class,"name=?","A1");if(count==1){    Log.i(TAG, "delete A1");}else{    Log.i(TAG, "delete A1 failed");}

deleteAll跟updateAll方法一样,都会返回受该次操作影响的记录数量。

总体来看,LitePal的数据库操作核心类为DataSupport!而DataSupport所提供的方法(多达75个,其中2个弃用),远不止文中所述的几个。

例如将某列更新为默认值。

Hero hero = new Hero();hero.setToDefault("age");hero.UpdateAll();

由于age为整型,其默认值为0,而updateAll无条件,所以,所有的hero记录的age列,均被更新为0。

除此之外,DataSupport还保留了sql接口方法,供开发人员直接使用。

public static synchronized Cursor findBySQL(String... sql) 

数据库结构的更新

对于数据库的更新,跟SqliteOpenHelper类似。
(1)将litepal.xml中的version值变大
(2)更新表所对应的实体类

原有数据,不会因为实体类的更新而丢失。当然,除非你删除了某一属性(列)。

至此,LitePal的简单小结完成。

其实LitaPal在github中的quick start已经很全面了。如有纰漏,可以直接参考原文。
https://github.com/LitePalFramework/LitePal

原创粉丝点击