Android中使用LitePal操控SQLite数据库
《第一行代码》读书手札
(一)什么是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() {@Overridepublic 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数据库相关推荐
- 在Android中查看和管理sqlite数据库
在Android中查看和管理sqlite数据库 在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库 ...
- android 访问sqlite,android中访问已有的sqlite数据库
推荐文章 每天进步记录一点点 话说经常性的操作svn出现各种问题,而度娘一直帮倒忙,是不是很手足无措. 有时问题还是要记录下来的.说不定还会有惊喜. 昨天遇到个问题,搜索了一下,发现第一条就是自己写的 ...
- android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?
Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...
- android打开sqlite数据库,Android:打开和关闭SQLite数据库
我正在开发和android应用程序,我经常使用它访问本地数据库.这个数据库可以从不同的therads访问,所以我对数据库有一个协调问题.我使用以下open()和close()方法.Android:打开 ...
- android读写access数据库,Android中利用远程Microsoft Access数据库应用程序
我写一个Android应用程序,它接受一个字符串,通过条码阅读器读取,然后当一个特定的按钮按下时,它会认为字符串发送到数据库将他们的价值设定为"库存"或"缺货" ...
- 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
自己做一个单词词典,打算从bing词典爬单词. 单词怎么来? 取一些英文文本的txt文件,写一个py文件取txt中的单词存到SQLite数据库中. py文件的功能是: 选择出txt文本中的所有单词,正 ...
- delphi通过php连接数据库,delphi2010中使用sqlitesimpledelphi连接sqlite数据库并解决中...
delphi2010中使用sqlitesimpledelphi连接sqlite数据库并解决中 作者:小涵 | 来源:互联网 | 2014-05-28 16:21 阅读: 6469 应女朋友的要求,要写 ...
- android ORM框架LitePal 封装SQLite
LitePal的基本用法 虽说LitePal宣称是近乎零配置,但也只是"近乎"而已,它还是需要进行一些简单配置才可以使用的,那么我们第一步就先快速学习一下LitePal的配置方法. ...
- Android内部自带的SQLite数据库操作dos命令
1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...
- android studio SQLScout插件查看sqlite数据库
SQLScout (SQLite Support) SQLScout (SQLite Support) 是android studio集成开发工具中查看SQLite数据库的插件. 1.安装 file- ...
最新文章
- IDEA HTTP状态 404 - 未找到 请求的资源[/]不可用
- nginx配置文件防盗链
- php变量的判空和类型判断
- linux该专接本还是工作_2020河北专接本报考录取比例相差最大专业TOP榜,出乎意料吗?...
- win10如何关闭F1~F12快捷键?
- ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码
- 在word中添加内容控件,报错未实现该方法或操作
- Office Communications Server 和客户端使用的端口和协议
- netron神经网络可视化
- Leetcode91. Decode Ways
- linux c 笔记 线程控制(一)
- Atitit 信息安全常见基础技术 目录 1. 加密	1 2. 签名(防篡改)	1 2.1. 第4章 标识与认证技术 	1 2.2. 第5章 授权与访问控制技术 	1 2.3. 第9章 安全审计与责
- CommandName 限制
- 9款非常适合Sketchup的渲染插件以及优点介绍
- python基础题-字符串列表训练
- Chrome 浏览器安装扩展程序
- android 接口回调全面,Android 回调机制--接口回调
- python获取股票_python根据股票代码获取当前数据
- C语言:IF-ELSE的配对问题
- linux - Visual Studio Code 的安装与卸载