2.使用LitePal开源库来操作数据库

介绍:

LitePal是一款开源的Android数据库框架,它采用了对象关系映射技术(ORM)的模式,并将我们平时开发最常用到的数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作.
LitePal 的项目主页上也有详细的使用文档,地址是:https://github.com/LitePalFramework/LitePal

技能1:使用LitePal:

  • 第一步:在Android studio中对开源库的引用就可以了
    在app/build.gradle文件中,对dependencies闭包中添加如下引用
dependencies {
    compile 'org.litepal.android:core:2.0.0'
}
  • 添加的这行声明中,前面部分是固定的,最后的2.0.0是版本号的意思,最新的版本号可以到LitePal的项目主页上去查看

这样我们就成功引入到当前项目中了

  • 第二步:配置litepal.xml文件.
    右击app/src/main目录 new->Directory创建一个assets目录,然后再assets目录下再创建一个litepal.xml文件,接着编辑litepal.xml文件中的内容,内容如下
<?xml version = "1.0" encoding = "utf-8" ?>
<litepal>

   <dbname value = "cool_weather"/>

   <version value = "1"/>

   <list>

   </list>
</litepal>
  • 其中
    <dbname> 标签用于指定数据库名
    <version>标签用于指定数据库版本号
    <list>标签用于指定所有的映射模型
    <mapping>标签用于声明我们要配置的映射模型类,注意一定要使用完整的类名(在Android studio 中对着类名右键,copy reference 复制完整的类名),不管有多少个模型类需要映射,都使用同样的方式配置在<list>标签下
  • 最后一步:配置LitePalApplication,修改AndroidManifest.xml 中的代码,加入android:name="org.litepal.LitePalApplication

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.study.wzm.coolweather">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/logo"

通过以上的配置,已经可以让LitePal的所有功能都正常工作了

技能2:创建和升级数据库

  • 刚才在介绍的时候说过,LitePal采取的是对象关系映射(ORM)的模式,那么什么是对象关系映射?简单点来说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射.
    那么我们就可以通过面对对象的思维来操作数据库,而不用再和SQL语句打交道了.
  • 定义一个City类
import org.litepal.crud.DataSupport;

public class City extends DataSupport {


    private String cityName;//市名字
    private int cityCode;//市代号
    private int provinceId;//当前市所属于省的id值
   
    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public int getCityCode() {
        return cityCode;
    }

    public void setCityCode(int cityCode) {
        this.cityCode = cityCode;
    }

    public int getProvinceId() {
        return provinceId;
    }

    public void setProvinceId(int provinceId) {
        this.provinceId = provinceId;
    }
}

  • 这是一个典型的java bean ,在City类中我们定义了各成员变量,并生成了setter getter方法. City类就会对应数据库中的City表,而类中的每一个成员变量分别对应了表中的每一列,这就是对象关系映射最直观的体验.
  • 仅有这样还不行,我们要在litepal.xml中添加City类到映射中去,在list标签中加入
    <list>

    <mapping class = "test.study.wzm.coolweather.db.City"/>

    </list>
  • 这样就已经把所有工作都完成了,在需要创建数据库和表的逻辑里执行代码
    LitePal.getDatabase();
  • 就将数据库和表都创建完成了.

升级数据库中的表

  • 修改你想改的任何内容,然后将litepal.xml中的<version>版本号加1即可
    比如我们想在city表中添加一个id列,直接修改City类中的代码,加入成员变量id,并添加setter和getter方法
    private int id;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
<version value = "2"/>
  • 重新运行创建数据库逻辑即可升级数据库成功

添加数据

  • 所有的数据库表都要继承DataSupport类才能进行增删查改
    1,创建出模型类的实例
    2,将所有要存储的数据设置好
    3,最后调用一下save方法保存.
City city = new City();
city.setId(001);
city.setCityName("广州");
city.setCityCode(9527);
city.save();

更新数据

  • 1.new出实例
    2.直接调用setter方法设置要更新的数据
    3.最后调用updateAll方法执行更新操作.
  • 注意: updateAll方法中可以指定一个条件约束,和SQL中where参数有点类似,但是更加简洁,如果不指定条件语句的话,表示更新所有数据.
City city = new City();
city.setId(002);
city.updateAll("cityName = ? and cityCode = ?","广州","9527");

将符合条件是广州和9527的数据进行更新为id = 2;

将字段值设置为默认值时,只能调用setToDefault()方法,接收一个参数,传入相应的列名

City city = new City();
city.setToDefault("provinceId");
city.updateAll();

这段代码将所有的provinceId都更新为0,因为updateAll()方法中没有指定约束条件,所以更新操作对所有数据都生效.

删除数据

DataSupport.deleteAll(city.class,"cityCode < ?","9526");

deleteAll()方法第一个参数用于指定删除哪张表中的数据,
第二个参数用于指定约束条件,删除city表中cityCode低于9526的城市.
如果不指定约束条件,则删除表中所有的数据.

查询数据

  • 调用DataSupport.findAll()方法,返回一个List集合,接收一个参数,指定查询哪个表.
List<City> cities = DataSupport.findAll(City.class);
for( City city: cities){
    log.d("MainActivity","city name is "+ city.getCityName());
}

  • 除了findAll方法外,LitePal还提供了很多其他非常有用的api,比如我们想查City表中的第一条数据就可以这样写:
    City firstCity = DataSupport.findFirst(city.class);

  • 查 City表中的最后一条数据可以这样写:
    City lastCity = DataSupport.findLast(city.class);

  • 还可以通过连缀查询来定制更多的查询功能:

  • select()方法用于指定查询哪几列的数据,对应了SQL当中的select关键字,比如只查cityName和id
    List<City> cities = DataSupport.select("cityName","id").find(city.class);

  • where()方法用于指定查询的约束条件,对应SQL当中的where关键字.比如只查cityCode大于9526的数据,
    List<City> cities = DataSupport.where("cityCode > ?","9526").find(city.class);

  • order()方法用于指定结果的排序方式,对应SQL当中的order by 关键字.比如将查询结果按照id从高到低排序,可以这样写:
    List<City> cities = DataSupport.order("id desc").find(city.class);
    其中desc表示降序排列,asc或者不写表示升序排列

  • limit()方法用于指定查询结果数量,比如只查表中的前3条数据
    List<City> cities = DataSupport.limit(3).find(city.class);

  • offset()方法用于指定查询结果的偏移量,比如查询表中的第2,3,4条数据
    List<City> cities = DataSupport.limit(3).offset(1).find(city.class);

  • 当然可以对这5个方法进行任意的连缀组合,完成一个比较复杂的查询操作

List<City> cities =  DataSupport.select("cityName","id")
.where("cityCode > ?","9526")
.order("id")
.limit(10)
.offset(10)
.find(city.class);

查询city表中,第11~20条满足cityCode大于9526这个条件的cityName和id这两列数据,并将查询结果按照页面升序排列.

Litepal的查询还支持原生SQL来进行查询:

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

推荐阅读更多精彩内容