《第一行代码》读书手札


(一)什么是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. Oraclecloud创建时没有上传公钥的解决办法

    https://blogs.oracle.com/cloud-infrastructure/recovering-opc-user-ssh-key-on-oracle-cloud-infrastruc ...

  2. 中山纪中集训Day2又是测试(划水)

    A组T1 bzoj 2674 Attack Description chnlich 非常喜欢玩三国志这款游戏,并喜欢用一些策略出奇制胜.现在,他要开始征服世界的旅途了.他的敌人有N 座城市和N 个太守 ...

  3. zabbix基于docker安装

    centos的版本 # cat /etc/redhat-release CentOS Linux release (Core) docker的安装 配置yum源 # vim /etc/yum.repo ...

  4. At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger fo

    一.文章前言 本文是亲测有效解决At least one JAR was scanned for TLDs yet contained no TLDs问题,绝对不是为了积分随便粘贴复制然后压根都没有用 ...

  5. html访问图片资源403问题(http referrer)

    前言 之前碰到一个问题,就是html中通过img标签引入一个图片地址,报403.但是这个图片地址直接复制出来在地址栏打开,却是看得到的.     先说下解决方法: 在HTML代码的head中添加一句& ...

  6. 关于微信手机端IOS系统中input输入框无法输入的问题

    如果网站不需要阻止用户的选择内容的行为就可以使用如下样式: * { -webkit-user-select: text; -user-select: text;}另一种方式: *: not(input ...

  7. Shell Script 入门教程

    和 Shell 的区别 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁. Shell 即是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提 ...

  8. Andorid-解决View重复点击的思路

    Andorid-解决View重复点击的思路 转 https://www.jianshu.com/p/10d400a296fe 最近遇到一道面试题,题目是在App开发中,如何防止多次点击支付或者多次点击 ...

  9. 如何解决Access操作或事件已被禁用模式阻止

    操作或事件已被禁用模式阻止.本来是Access安全设置的一部分,可以防止一些危险性的宏自动运行损坏数据,但是如果是自己在设计或是修改Access数据库的时候,这个就比较烦人了,一次次的提示,每次都需要 ...

  10. 006-guava 集合-集合工具类-集合扩展工具类

    一.概述 需要实现自己的集合扩展.也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集 二.使用 2.1.ForwardingList装 ...