《第一行代码》读书手札


(一)什么是LitePal数据库

LitePal数据库是安卓的一个开源库,我们在以后的开发中,将会遇到许许多多的开源库,感谢开源社

区;因为开源社区的存在,一些我们需要的功能,不再需要我们从头开始写,我们就可以直接使用;


(二)配置LitePal

由于LitePal是开源的第三方库。但是,我们的JDK开发包中,并没有内置这些第三方包,所有,我们

需要配置一下;

在Android Studio中,引用第三方库特别简单,只需要在app/build.gradle文件中声明需要使用的

开源库的引用即可;


LitePal开源库的引用:

compile ‘org.litepal.android:core:1.3.2’

 将引用写到图中所示位置

引用开源库:(按照图中标准的数字序号,注意配置过程中,需要联网


配置litepal.xml文件

在app/src/main目录下,创建一个assets目录;创建方法New——>Directory,将这个文件夹命名

为assets,然后在assets目录下新建一个litepal.xml文件;(一般都没有现成的xml选项,这里我们

就选择新建File文件,在起名字的时候,写上后缀xml,即是一个xml文件)

在该xml文件中写上如下内容:

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

简单说明一下:

1. < dbname> 标签用于指定数据库的名字

2. < version> 标签用于指定数据库的版本号

3. < list> 标签用于所有的映射模型,稍后才会用户


最后再修改 AndroidManifest.xml 的代码

在< application>标签里面加上一句:

android:name="org.litepal.LitePalApplication"


现在,我们就可以在项目中使用LitePal了,至此我们就可以运用面向对象的思想

操控数据库了!

创建,升级,增删改查,这些动作都是数据库的吗?答案是肯定的!那么,数据

库自己应该最清楚这些操作,怎么来执行。这就是面向对象的思想的体现。




(三)创建和升级数据库

在这之前,在安卓中创建数据库,需要自己写一个数据库帮助类,继承SQLiteOpenBasedata类,在复

写onCreate()等方法;不知你们觉得繁琐与否,反正我觉得很烦;

a.先创建一张Book表

之前,我们创建表,需要我们自己去写数据库建表语句;万一,我们要 不会写

SQL语句怎么办呢?是不是很尴尬! 现在,救星来了——LitePal开源库。从此可以和

SQL说再见了!(但是SQL,最好还是掌握)


*使用LitePal 建表


1.先写一个JavaBean;表的名字,就是Javabean的名字、表的字段,就是javabean

的属性;属性和表的列,现在就是一一对应的,这也是对象关系映射的体现。

每张表都对应一个Model模型类

不知道什么是Javabean的童鞋,自己去面壁。

这里只有private字段,才会被映射到数据库的表中

其中id,id相当于LitePal中的关键字了,无论你设置有否,它都是默认增长的,就是主键;

代码:

/**
* JavaBean,就是一个类,用来保存数据的;
* 可以记为:为自己的字段,提供了get或set方法;
* Created by Allbet on 2017/10/31.
*/ public class Book {
private int id ;
private String name;
private String author ;
private float price ;
private int pages ; public void setId(int id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} public void setAuthor(String author) {
this.author = author;
} public void setPrice(float price) {
this.price = price;
} public void setPages(int pages) {
this.pages = pages;
} public int getPages() {
return pages;
} public int getId() {
return id;
} public String getName() {
return name;
} public String getAuthor() {
return author;
} public float getPrice() {
return price;
}
}

2.将写好的javaBean类添加到映射关系模型中,就是之前我们说的litepal.xml文件

的list标签里面。使用< mapping>标签配置映射模型的Javabean类

代码:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--数据库的名字-->
<dbname value="BookStore"></dbname>
<!--数据库的版本号-->
<version value="1"></version> <list>
<!--这里的class中,必须写上包的完整名称-->
<mapping class="allbet.memory.cn.keepnamepass.Book"></mapping>
</list>
</litepal>
以后不管有N多Javabean类需要配置,都是这样配置的。

3. 调用Connector的getDatabase( )方法

Connector类是LitePal库中的类

代码:

仅仅给出关键代码,代码太长了;这里是写在一个按钮监听器中;
 btn_createSql.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 使用LitePal创建数据
// 就是一句话的事
Connector.getDatabase() ;
}
});

到此数据库,就创建完成;并且,我们刚刚添加到litepal.xml的关系映射模型的Javabean类,也被当做表创建出来了;

怎么样呢?是不是,不需要我们去写自己的数据库帮助类,也不需要去写SQL的建表语句了;


有个很神奇的地方:

之前我们升级数据库的时候,比如:为表增加一列,我们有两种做法,一种是先删除,再新建;另一种则是为了保存数据,需要一张中间的临时表,用来保存数据;

但是在litepal中,一切都变了 ! 时移世易,那就是,只管改动你想要改动的内容,其他的我(LitePal)替你做了;比如:想要在表中增加新的列,那么就去对应的JavaBean类中添加字段,然后再次执行getDatabase()方法,即可;LitePal自己会自动保存数据,也不会出现表已经存在的错误;假如要添加添加新的表,就将新表对应的JavaBean配置到list标签下,上面的操作,都要记得更新下数据库的版本号;

简单理解为:增加新的字段就去修改对应的Javabean;增加新的表,就去配置新写的javaBean类;

如果还在想,为什么这样直接添加字段会对吗,数据库中已经存在这样表了等问题;笔者建议,忘记之前学的SQLiteDatabase吧,投入LitePal的怀抱啊




(四)使用LitePal进行CRUD操作

使用LitePal进行CRUD操作的时候,需要让代表表的JavaBean类继承自DataSupport ;


添加数据

1.新建一个javaBean的实例

2.调用实例的方法,将数据添加到实例中

3.调用继承来的save()方法;

代码:

//                添加数据
Book book = new Book() ;
// 添加数据
// 无论,怎么设置id,id都会自动增长
book.setId(1);
book.setName("第一行代码");
book.setAuthor("郭霖");
book.setPages(590);
book.setPrice(59.00f);
// 调用save()方法
book.save();

可以看出,即使代码中我们设置id一直为1,但是不会起作用的;

因为LitePal,把id当成关键字了,当成主键,即使你不写id字段,也会自动添

加;




更新数据

最简单的方法:对已经存储的对象,重新赋值

已经存储的对象 : 在LitePAL中,判断对象是否已经存储,根据model.isSave()方法 来判断的 ;

只有两种情况下可以返回的true;

1.一种是调用了model.isSave()方法,此时model会被认为是已存储的对象;

2.model对象是通过LitePal的API查出来的;

代码:我们目前只能使用第一种方法;

API后面才会学习
//                更新数据
Book book = new Book() ;
// 没有赋值的列,会被自动赋默认值
// 就是java中类型的默认值
book.setPrice(12.3f);
book.save() ;
// 这里book是之前已经存储的对象了
// 因此,再次设置价格,就是更新价格
book.setPrice(20.2f);
book.save() ;

图中可以看出价格的确被更新了,至于为什么不是20.2,而是后面多了一些奇怪

的东西;是因为计算机的精确度问题,就是一加一,要是精度都显示出来,结果

其实是2.00000242871 什么的;

可以看出来,这样更新数据,很有局限性;如果我们想更新任何任何对象呢?使用下

面的方法


代码:灵活点的写法

其中假如要将某些列,更新为默认值的时候,调用setDefault(列名)
                Book book = new Book() ;
book.setPrice(12f);
book.setName("肥嘟嘟左卫门");
book.setPages(2);
book.setAuthor("蜡笔小新");
// 更新数据,如果不写参数,则更新所有所有数据
// 这里更新作者是郭霖的列
book.updateAll("author=?","郭霖") ;

可以看出数据已经得到更新;


(三)使用LitePal删除数据

有两种方法:

1. 调用已存储对象的delete()方法 ;

    什么是已存储对象,之前讲过,不再重复演示

2. DataSupport类的静态方法deleteAll( )方法;

不写参数,删除表中所有数据;

代码:

//                删除数据,deleteAll()不再是实例方法,而是DataSupport类的静态方法了
// 原因很简单,删除数据,不需要实例存在
// 更新数据,需要实例来指定数据
// 第一个参数:指定删除的表,也就是对应的JavaBean类
// 后面是一个:变长参数;用于指定约束条件
// 不知道约束条件,就会删除表中的所有数据 // 删除id在12-22之间,价格大于10的书
DataSupport.deleteAll(Book.class, "id > ? AND id<? AND price>?", "12","22","10");


(四)使用LitePal查询数据

1、 使用findAll( 表名);(查询表中所有数据)

将返回一个list<Javabean1类型>集合,集合中包含着查询到的数据

因此,拿出数据,也很简单了;可以使用加强for循环 - - foreach

代码:

 List<Book> list = DataSupport.findAll(Book.class) ;

                for(Book book:list){
//获取数据即可
}

2、 根据条件查询语句(还是返回list集合

select、where、参数都是变长参数,参数亦是约束条件


下面为select的源代码,可以看出参数确实是变长参数

public static synchronized ClusterQuery select(String... columns) {
ClusterQuery cQuery = new ClusterQuery();
cQuery.mColumns = columns;
return cQuery;

select( )方法:

DataSupport.select(变长参数).find(表名)

where方法:

DataSupport.where(变长参数).find(表名)

order( )方法:

DataSupport.where(列名+desc/asc).find(表名)

desc是降序排列,不写或者asc是升序

limit()方法:

DataSupport.limit(int).find(表名)

指定查询的数据的条数,从第一条开始计算

DataSupport.limit(3).find(表名) :当前查询1-3条数据

offset()方法:

DataSupport.limit(int).offset(int).find(表名)

指定指定查询的数据的条数的偏移量

DataSupport.limit(3).offset(2).find(表名) :当前查询数据为 3-5条

最厉害的是,上面的语句可以连缀起来使用:(用 . 连缀)

DataSupport.select("name","price")
.where("id>?","3")
.order("id desc")
.limit(3)
.offset(2)
.find(Book.class) ; 查询的数据:Book表中id大于3,的第3-5条数据,按照降序排列

Android中使用LitePal操控SQLite数据库的更多相关文章

  1. 在Android中查看和管理sqlite数据库

    在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databas ...

  2. Android中多表的SQLite数据库(译)

    原文: Android SQLite Database with Multiple Tables 在上一篇教程Android SQLite Database Tutorial中,解释了如何在你的And ...

  3. Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

    系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe ...

  4. 在Android程序中使用已有的SQLite数据库

    已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...

  5. Android菜鸟成长记11 -- sqlite数据库的设计和升降级

    Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...

  6. Android内部自带的SQLite数据库操作dos命令

    1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...

  7. Android 批量插入数据到SQLite数据库

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式 ...

  8. Android批量插入数据到SQLite数据库

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式 ...

  9. Android笔记(四十) Android中的数据存储——SQLite(二) insert

    准备工作: 我们模拟一个注册的页面,先看UI 我们需要创建一个数据库:user,数据库包含表user,user表包含字段id.username.password.mobilephone MainAct ...

随机推荐

  1. ZR#1012

    ## ZR#1012 blog咕咕咕了好久,开始补. 解法: 一个很显然的性质, $ x $ 只能转移到 $ x+1 $ 或者 $ 2x $ 处,所以我们可以以此性质建图,即 $ x $ 向 $ x ...

  2. 两个int类型的数据相加,有可能会出现超出int的表示范围。

    两个int类型的数据相加,有可能会出现超出int的表示范围. /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数. ...

  3. 记一次SpringContextHolder.getBean出现异常NoClassDefFoundError: Could not initialize class

    代码如下: public class TestUtils { private static UserDao logDao = SpringContextHolder.getBean(UserDao.c ...

  4. RabbitMQ入门学习系列(七) 远程调用RPC

    快速阅读 生产者和消费者启动以后,都有一个接收事件,消费者是接收事件是处理调用方法以后等待生产者的返回,生产者的接收事件是处理接收生产者发送的消息,进行处理.消费者发送的时候要在回调队列中加入一个标识 ...

  5. certification on windows and

    https://jingyan.baidu.com/article/335530dae0eb2319ca41c378.html

  6. GIS地理工具案例教程——栅格分割

    GIS地理工具案例教程--栅格分割 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 目的:利用多边形要素类去分割栅格,每个多边形裁剪出对应的范围 ...

  7. android ------ 实现高德定位并获取相应信息 ( 最新版高德SDK 和 Android SDK版本)

    Android开发项目时常常会遇到定位这个功能, 很久以前写过一篇了,官方也更新了一些东西,我也更新下 以前使用的是jar包 导入来实现高德定位 老版本 链接:https://www.cnblogs. ...

  8. Android开发三步骤

    产品经理给需求,UI给图片 开发 *写布局文件 *写Java代码 测试

  9. shell编程系列17--文本处理三剑客之awk动作中的表达式用法

    shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...

  10. C/C++ socket编程教程之九:TCP的粘包问题以及数据的无边界性

    C/C++ socket编程教程之九:TCP的粘包问题以及数据的无边界性 上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发 ...