4.5、使用LitePal操作数据库

4.5.1、LitePal简介

LitePal是一款开源的Android数据库框架

采用了关系映射(ORM)的模式

将经常使用的一些数据库做了封装

是得不用编写SQL语句就可以完成各种增删改查的操作

地址在github上可以进行查看

4.5.2、配置LitePal

首先在app/build.grade文件中:

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

前面是固定的部分,后面的数字是版本号

在app/src/main目录下新建一个文件夹:assets

然后创建litepal.xml文件

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

标签的含义:

<dbname>指定数据库名

<version>指定数据库的版本号

配置AndroidManifest中的代码:

    <application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
.....

将application配置为org.litepal.LitePalApplication只有这样才能让LitePal的所有功能都可以正常工作

4.5.3、创建和升级数据库

LitePal采取的是对象关系映射(ORM)模式

简单的说:

使用的编程语言是面向对象的语言,而使用的数据库则是关系型数据库

将面向对象语言和关系型数据库之间建立的一种映射关系------对象关系映射

它赋予开发者一个强大的功能,就可以使用面向对象的思维来操作数据库

不用在和SQL语句打交道。

新建一个Book类:

public class Book {
private int id;
private String author;
private float price;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}

这是一个典型的Java Bean,在Book类中定义了4个字段

并且生成了相应的getter和setter方法

Book类会对应数据库中的Book表

每一个字段分别对应表中的每一个列

在litepal.xml中:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="stores"></dbname>
<version value=""></version>
<list>
<mapping class="com.example.ccrr.applicationtwo.Book"></mapping>
</list>
</litepal>

<mapper>标签来声明我们需要配置的映射模型

填写的是完整的类名

里面可以同时可以指定多个配置

在MianActivity中

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout); Button date_create = (Button) findViewById(R.id.create_date);
date_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();
}
});
}
}

调用Connector.getDatabase()方法就是一个嘴贱的数据库操作

只要点击按钮一下,数据库就会自动完成创建

点击完成之后:

使用adb shell进行查看:

进入:

在使用.schema命令查看见表语句

一共三张表:

table_schema是LitePal内部使用的

book表是根据我么你定义的Book类以及类中的字段自动生成的

更新:

使用LitePal更新数据表也是很方便的

只需要修改相应的内容然后再版本号后加1即可

此时创建新的Java类:

public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

再litepal.xml中:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="stores"></dbname>
<version value="3"></version>
<list>
<mapping class="com.example.ccrr.applicationtwo.Book"></mapping>
<mapping class="com.example.ccrr.applicationtwo.Category"></mapping>
</list>
</litepal>

此时点击按钮:

进行查看:

4.5.2、使用LitePal添加数据

这里的Java实体类需要继承:DataSupport类

public class Book  extends DataSupport{
private int id;
private String author;
...
}

首先定义一个按钮:

    <Button
android:id="@+id/add_data_litepal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
/>

MianActivity中:

        //添加数据
Button add_data_litepal = (Button) findViewById(R.id.add_data_litepal);
add_data_litepal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book = new Book();
book.setAuthor("MrChengs");
book.setName("Android");
book.setPrice((float) 12.2);
book.save();
}
});

这里的使用方法非常简单

只需要将创建好的实例调用save()方法即可

此时使用adb shell进行查看:

可以查询到此时的数据已经存储再数据库中!!!

4.5.5、使用LitePal更新数据

首先:最简单的一种更新的方式就是对已存储的对象重新设值

然后调用save()方法即可

已存对象:

对象是否已存储就是调用model.isSaved()方法的结果来判断

返回为true就是表示已存储

返回为false就表示未存储

有两种情况下model.isSaved()方法才会返回true:

1、已经调用过model.save()方法去添加数据,此时的model就会被认为时已存储的对象

2、model对象时通过LitePal提供的查询API查出来,由于是从数据库中查询对象,会认为是已存储的对象

首先使用第一种方法:

1、已经调用过model.save()方法去添加数据,此时的model就会被认为时已存储的对象

定义按钮:

    <Button
android:id="@+id/update_data_litepal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改数据"
/>

MianActivity

        //修改数据
Button update_data_litepal = (Button) findViewById(R.id.update_data_litepal);
update_data_litepal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book = new Book();
book.setAuthor("MrChengs");
book.setName("Java");
book.setPrice((float) 12.2);
book.save();
book.setName("C#");
book.save();
}
});

此时点击事件之后:

此时设置的数据第一次是Java第二次是C#

连续调用两次save()方法

此时LitePal会发现当前的Book对象是已存储的

因此不会向数据库中添加一条新的数据

第二种方法

2、model对象时通过LitePal提供的查询API查出来,由于是从数据库中查询对象,会认为是已存储的对象

此时再MainActivity中:

//修改数据
Button update_data_litepal = (Button) findViewById(R.id.update_data_litepal);
update_data_litepal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book = new Book();
book.setName("Android");
book.setPrice((float) 100.0);
book.updateAll("id = ? and author = ?","2","MrChengs"); }
});

点击事件之后的结果:

4.5.6、使用LitePal删除数据

两种方式:

1、直接调用已存储对象的delete()方法

按钮控件:

    <Button
android:id="@+id/delete_data_litepal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"
/>

MainActivity中:

        //删除数据
Button delete_date = (Button) findViewById(R.id.delete_data_litepal);
delete_date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataSupport.deleteAll(Book.class, "price < ?", "");
}
});

调用DataSupport.deleteAll()方法

第一参数用于指定删除那个表中的数据,传入Book.class即Book表中的数据

后面的参数用与制定约束条件

如果不指定约束条件就代表删除表中的所有数据

4.5.7、使用LitePal查询数据

再查询方面LitePal做了优化

可满足大多场景的查询需求

定义控件:

    <Button
android:id="@+id/query_data_litepal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"
/>

MainActivity中:

//查询数据
Button query_btn = (Button) findViewById(R.id.query_data_litepal);
query_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Book> books = DataSupport.findAll(Book.class);
for (Book book : books){
Log.d("book:", book.getAuthor());
Log.d("book:",book.getName() );
Log.d("book:", String.valueOf(book.getId()));
Log.d("book:", String.valueOf(book.getPrice())); }
}
});

只需要调用一下findAll()方法

然后通过Book.class参数指定Book表就可以了

findAll()方法返回的是一个Book类型的List集合

点击按钮之后:

处findAll()方法之外还有其他的方法:

1、查询Book数据表中的第一条数据

Book firstBook = DataSupport.findFirst(Book.class)

2、查询Book表中的最后一条数据

Book lastBook = DataSupport.findLast(Book.class)

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

1、select()方法用于指定查询哪几列的数据

List<Book> books = DataSupport.select("name","author").find(Book.class)

2、where()方法用于指定查询的约束条件

List<Book> books = DataSupport.where("price > ?”,“100”).find(Book.class)

3、order()方法用于指定结果的排序方式

List<Book> books = DataSupport.order("price desc").find(Book.class)

4、limit()方法用于指定查询结果的数量

List<Book> books = DataSupport.limit(5).find(Book.class);

5、offset()方法用于指定查询结果的偏移量

List<Book> books = DataSupport.limit(5).offset(3).find(Book.class)

  解析:limit()限制数量为前5条数据,offset()偏移量为3此时是4-9条数据

以上五个方法可以任意组合起来完成一个复杂的查询

4、Android-数据存储方案(使用LitePal操作数据库)的更多相关文章

  1. Android数据存储之SQLite的操作

    Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...

  2. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

  3. Android Learning:数据存储方案归纳与总结

    前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...

  4. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  5. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  6. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  7. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  8. 10、Android数据存储

    课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...

  9. Sqlserver 高并发和大数据存储方案

    Sqlserver 高并发和大数据存储方案 随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高!   ...

随机推荐

  1. 三:SpringCloud-Ribbon

    六:Ribbon负载均衡 1. 概述 1.1 是什么 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套==客户端 负载均衡==的工具. 简单的说,Ribbon是Net ...

  2. 1、类、封装(私有private、this关键字)

    类与对象 对象在需求中的使用 ​ 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. ​ 我们把大象装冰箱为例进行分析. ​ 在针对具体的需求,可以使用名词 ...

  3. Java新人拿到一台新的电脑需要装配什么

    适用对象:新手 装备:win10 一.IDEA 插件等 说明 其他 TranslationPlugin 翻译插件 GitHub地址 MyBatis-Generator 自动生成Mybatis文件 Al ...

  4. 面试遇到的mysql面试题

    1.MySQL数据库有哪些内置函数?1.数学函数 2.字符串函数 3.日期和时间函数 4.条件判断函数5.系统信息函数 6.加密和压缩函数 7.聚合函数8.格式或类型转化函数. 2.如何返回一张表的数 ...

  5. 用手机管理及维护MySQL,Oracle等数据库

    现在移动办公的情况及需求越来越多,平时MySQL,Oracle,SQLServer等数据库的管理都要通过客户端工具操作,现在有一款基于web网页的软件:TreeSoft数据库管理系统,在服务器布署一套 ...

  6. 记录一次teamview无法远程连接对方teamview的过程

    问题描述: teamviewer 提示 超时后连接被阻断.您的许可证对您与伙伴的最大话时间有所限制...... 解决方法: 1.先将自己的teamview完全卸载,连同安装目录一起删除.尽量卸载完全 ...

  7. 手写堆优化dijkstra

    \(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...

  8. drupal7 profile2模块获取个人信息

    一.问题背景: 用profile2模块,扩展个人信息,增加了“手机号”等信息,一些地方想要获取当前用户的手机号 二.解决办法: 用profile2自带的方法:profile2_load_by_user ...

  9. JDBC中处理事务,小Demo

    事务的四大特性(ACID):  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败.  一致性(Consistency):事务执行 ...

  10. Qt获取控件位置,坐标总结

    总结的结果是: QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标.   总结一:经过试验,QMouseEvent::globalPos()  和 QCursor::pos()效果 ...