Android LitePal的使用详解

前言

数据库操作一直都是比较繁琐而且单一的东西,平时开发中数据库也很常见。有学过mysql的读者可能会觉得sql语句确实让人很难受。同样android中,虽然有内置数据库SQLite,但是操作起来还是非常的不方便。跟网络请求类似,当我们用原生的HttpURLConnection请求数据再用json解析,过程很繁琐,所以我们一般是封装成一个工具类,但是retrofit出现了,他帮我们解决了网络请求和解析数据的封装,同时还支持RxJava的异步,十分强大。不了解retrofit的读者也建议你们去学习一下retrofit确实非常好用。LitePal也是同样的道理,把创建数据库和增删查改等等操作都封装起来,所以我们用起来会非常的方便。同时还支持异步操作,不需要我们自己去开启子线程,代码非常的整洁,简单。那接下来就来看看这个神奇的框架LitePal。

简述映射

LitePal是采用映射的方式来把数据存储在数据库中的,和GSON的道理是一样的。例如我们现在有一个类,这个类必须是javaBean类:

public class Student extends LitePalSupport {
  private String name;
  private int age;
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

那么他在数据库中就会有一个表,这个表有三列:id,name和age,id是自动生成的,这样就可以理解映射了吧。所以我们使用LitePal的时候不用去指定每一列是什么,只需要给他一个Bean类,自动就会生成了。

配置LitePal

LitePal使用之前需要先配置一下,一共分为两步:

  • 添加依赖库:在app/build.gradle中添加如下内容:
dependencies {
 implementation 'org.litepal.android:java:3.0.0'
}

其中3.0.0是版本号,写这个文章的时候是3.0,他更新也是很快的,读者可以自行到文末进入官网查询最新的版本号。添加完之后sync一下就行了。

  • 修改AndroidManifest中的代码:添加一句android:name=”org.litepal.LitePalApplication”:
<application
   android:name="org.litepal.LitePalApplication"
   ...
<application
添加这句的意思是让启动app的时候会自动实例化LitePalApplication这个类供给LitePal这个框架使用。如果有自己写了一个android:name的,那么只需要添加这一句LitePal.initialize(context);就可以了。其中的context参数为全局app的context。例如:
```java
public class myApplication extends Application {
  private static Context context;

  @Override
  public void onCreate() {
    super.onCreate();
    context = getApplicationContext();
    LitePal.initialize(context);
  }

}
  • 在main目录下创建一个Directory:assets。然后再assets目录下再创建一个litepal.xml,如下图:

  • 编辑litepal.xml中的内容:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
 <dbname value="bookStore"/>
 <version value="1"/>

 <list>
 </list>

``` dbname就是数据库的名字,version是数据库的版本,list中是数据库中的表,可以在这里添加,怎么添加后面会讲到。

CRUD操作

常规增删查改操作,但是在这个框架下都显得特别的简单。

增加表和数据

例如我们现在要在数据库中创建一个学生的表,首先要创建一个学生的类,再让他继承LitePalSupport类,至于为什么下面会讲到:

public class Student extends LitePalSupport {
 private String name;
 private int age;
 public String getName() {
   return name;
 }

 public void setName(String name) {
   this.name = name;
 }
 public int getAge() {
   return age;
 }
 public void setAge(int age) {
   this.age = age;
 }
}

然后在刚才的litepal.xml中添加表:

<list>
   <mapping class="com.example.myapplication.Student"/>
</list>
这里的class要是你的类的真实目录,视具体情况而定。
添加其他的表也是同样的道理。
调用student对象的save()方法:
```java
Student student = new Student();
        student.setAge(12);
        student.setName("hha");
        student.save();

这里的save方法就是继承前面的LitePalSuppport类的,调用这个方法后就会自动添加到库中对应的表中的一行。
添加其他行数据也是同样的道理

更改表结构

更新表的列。例如前面的学生类是name和age,但是如果你想要增加一个studentId,可以很简单地实现。具体操作如下:

首先更改你的bean类,想怎么改就怎么改

在litepal.xml中更改版本号增加1.例如:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
 <dbname value="bookStore"/>
 <version value="2"/>
 <list>
     <mapping class="com.example.myapplication.Student"/>
 </list>

``` 把他改成2就行了。 ## 删除数据 删除数据也很简单,有两种删除方法,一种是指定行删除,一种给个约束条件删除。 1. 删除单行: LitePal.delete(Student.class , id); 2. 约束条件: LitePal.deleteAll(Student.class, "age > ?" , "12"); 指定约束条件删除,?是占位符会把后面的12放进去。 如果只传入一个Student.class,那么就会把整个表的数据都删除了

查询数据

查询数据的接口都会返回一个List,每一行对应一个对象。所以是LitePal把数据解析都给我们做好了,我们直接拿对象使用就ok了。这里有几种方法接口都看一下:

LitePal.findAll(Student.class,id);查询对应表的对应行,如果没有传入id参数,就返回这个表的所有内容。同样findFirst是返回第一行,findLast是返回最后一行。

查询的内容还可以进行筛选,这里就用到几个方法:

  • select()对应查哪几列的内容
  • where()查询的约束条件
  • order()排序方式
  • limit()指定查询的数量
  • offset()指定结果的偏移量。这个可能比较难理解,举个例子:假设你查的id是1,但是你设置了偏移量是1,那么返回的就是第二行的数据。

最后举一个综合例子演示一下:

List<Song> songs = LitePal.where("name like ? and duration < ?", "song%", "200")
                  .order("duration")
                  .select("name")
                  .limit(3)
                  .offset(3)
                  .find(Song.class);
这样就可以查询到对应的数据了。
# 异步操作
有时候如果我们的数据库中的内容很多,涉及到重量级的数据库操作往往是比较费时的,那么这个时候肯定时不能放在主线程去进行操作的,这样会造成系统卡死。那么我们就需要去把这个操作放在子线程中。LitePal早就为我们考虑到这个问题了,所以也增加了异步操作,轻松实现,来看看怎么用吧。
先看个例子:
```java
LitePal.findAllAsync(Song.class).listen(new FindMultiCallback<Song>() {
 @Override
 public void onFinish(List<Song> allSongs) {

 }
});

这是在官网中的例子,要注意的两个点

用findAllAsync代替findAll方法
添加listen方法,并新建匿名类FindMultiCallback<>()作为参数,重写里面的onFinish方法即可
这样获取完数据后就会执行onFinish方法了
轻松实现异步操作。同样这个可以结合上面的数据筛选。

创建多个数据库

如果你一个数据库不够用,想要创建多个数据库,当然也是可以的,看代码:

LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
LitePal.use(litePalDB);

这里就创建了一个库叫做demo2,并增加了一个表:Singer。最后执行LitePal.use方法来启用这个库。这样的话就默认使用这个库了。对象的save方法都会执行到这个库中
如果想切回到litepal.xml中的那个库,可以用下面的方法:
LitePal.useDefault();
如果想删除一个库(删库跑路可能会被乱棒打死)
LitePal.deleteDatabase(“demo2”);
是不是很简单?

监听数据库创建或者升级

当数据库创建或者升级的时候都会调用下面的两个方法:

LitePal.registerDatabaseListener(new DatabaseListener() {
  @Override
  public void onCreate() {
    // fill some initial data
  }

  @Override
  public void onUpgrade(int oldVersion, int newVersion) {
    // upgrade data in db
  }
});

可以在里面写要执行的逻辑。

总结

LitePal这个库确实是非常的强大,把很复杂的数据库操作都简化成了一个个的方法。但是更新很快,需要时刻看着他更新的内容,有可能会换API,所以建议大家多去官网学习。

以上就是Android LitePal的使用详解的详细内容,更多关于Android LitePal的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android利用LitePal操作数据库存取图片

    Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢迎,他们认为,在很多数据库语言里,处理大字段都是不容易的,像图片这样的文件放在数据库里会有问题:对数据库的读写速度永远赶不上文件系统的处理速度,使数据库变得巨大:但也有很多人认为像图片这样的数据存放在数据库中也有好处:易于备份,且备份速度绝对比备份文件快,比较容易数据迁移等等.其实这两种方法都有优缺

  • Android数据库LitePal的基本用法详解

    前言 正好项目用了这种数据存储方式,特地写一篇加深印象,在我看来,LitePal是使用最简单,集成最方便的数据库,没有之一. LitePal 简介 LitePal 是一款开源的 Android 数据库框架,它采用了对象关系映射(ORM)的模式,将我们平时使用的一些数据库(比如 Sqlite)功能进行了封装. 配置 第一步 gradle注入: compile 'org.litepal.android:core:1.6.1' 这里我的版本是1.6.1的,如果想获得最新版本,请看这里:https://

  • Android在Kotlin中更好地使用LitePal

    Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发. Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行. Kotlin已正式成为Android官方支持开发语言. 自从LitePal在2.0.0版本中全面支持了Kotlin之后,我也一直在思考如何让LitePal更好地融入和适配Kotlin语言,而不仅仅停留在简单的支持层面. Kotlin确实是一门非常出色的语言,里面有许多优秀的特性是在Java中无法实现的.因此,

  • Android LitePal的使用详解

    前言 数据库操作一直都是比较繁琐而且单一的东西,平时开发中数据库也很常见.有学过mysql的读者可能会觉得sql语句确实让人很难受.同样android中,虽然有内置数据库SQLite,但是操作起来还是非常的不方便.跟网络请求类似,当我们用原生的HttpURLConnection请求数据再用json解析,过程很繁琐,所以我们一般是封装成一个工具类,但是retrofit出现了,他帮我们解决了网络请求和解析数据的封装,同时还支持RxJava的异步,十分强大.不了解retrofit的读者也建议你们去学习

  • Android分包MultiDex策略详解

    1.分包背景 这里首先介绍下MultiDex的产生背景. 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一

  • Android系统对话框使用详解(最详细)

    在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现. 目录 一.系统对话框的几种类型与实现 在项目的实际开发中,用到的系统对话框几乎是没有的.原因大概包含以下几点: 样式过于单一,不能满足大部分实际项目中的需求. 对话框的样式会根据手机系统版本的不同而变化.不能达到统一的样式. 能实现的功能过于简单. 在这里先附

  • Android HandlerThread使用方法详解

    Android HandlerThread使用方法详解 HandlerThread 继承自Thread,内部封装了Looper. 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作). 用法: import android.app.Activity; import android.os.Bundle; import androi

  • Android中menu使用详解

    Menu(菜单)是Android中一定会使用的模块,每个Android项目都会用到Menu来给用户起到选择和导航的作用,提升用户体验,下面通过本文给大家分享android 中menu使用,需要的朋友一起看看吧 很多activity界面中都存在一个菜单栏,就是点击右上角的一个按钮的时候会出现一个下拉列表差不多的东西,这个功能的实现其实只需要下面的两步,每一个activity都可以拥有自己独一无二的menu,具体的格式可以自己进行定义,详细的创建步骤如下 ①在res下的menu中创建file_men

  • Android xml解析实例详解

    Android  xml解析实例详解 实现效果图: XmlActivity package com.Android.xiong.gridlayoutTest; import android.app.Activity; import android.content.res.XmlResourceParser; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; impo

  • Android AOP注解Annotation详解(一)

    Android 注解Annotation 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) Android AOP 等在Android上应用越来越广泛,例如框架ButterKnife,Dagger2,EventBus3等等,这里我自己总结了一个学习路程. - Java的注解Annotation - 注解处理解析器APT(Annotation Processing Tool)

  • Android Tab 控件详解及实例

    Android Tab 控件详解及实例 在桌面应用中Tab控件使用得非常普遍,那么我们经常在Android中也见到以Tab进行布局的客户端.那么Android中的Tab是如何使用的呢? 1.Activity package com.wicresoft.activity; import com.wicresoft.myandroid.R; import android.app.TabActivity; import android.os.Bundle; import android.util.Lo

  • Android canvas drawBitmap方法详解及实例

     Android canvas drawBitmap方法详解及实例 之前自己在自定义view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清.看源码函数也没理解,然后看了一些其他的博客加上自己的理解,整理如下.首先,我们看一张图片,今天就要绘制这张图片. 然后将图片用红色的线条分成4个部分,如下: 我们自定义一个View,代码如下: public class PoterDuffLoadingVi

  • Android init.rc文件详解及简单实例

    Android init.rc文件详解 本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析,此文件由语句组成,主要包含了四种类型的语句:Action,Commands,Services,Options.在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"\",如果在一行的末尾有一个反斜杠,那么

随机推荐