Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库
上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal。LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作,LitePal的项目主页上也有详细的使用文档,地址是:
https://github.com/LitePalFramework/LitePal
一、配置LitePal
要在项目中使用开源库,过去是需要下载开源库的Jar包或者源码,然后再集成到我们的项目中,而现在大多数的开源项目都会将版本提交到:jcenter上,我们只需要在:app/build.gradle文件中声明该开源库的引用就可以了。
第一步:编辑:app/build.gradle文件,在dependencies闭包中添加如下内容:前面部分是固定的,最后是版本号,最新的版本号可以在LitePal的项目主页上去查看。
第二步:配置:litepal.xml文件,右击:app/src/main目录 ---> New ---> Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件中的内容:
<dbname>标签:用于指定数据库名
<version>标签:用于指定数据库的版本号
<list>标签:用于指定所有的映射模型
第三步:配置LitePalApplication,修改AndroidManifest.xml中的代码:
将项目的application配置为:org.litepal.litePalApplication,这样才能让LitePal的所有功能都可以正常工作。(后面我们会对application进行详细的讲解)
二、创建和升级数据库
前面我们创建数据库是通过自定义一个类继承SQLiteOpenHelper,然后在onCreate()方法中编写建表语句来实现的,而使用LitePal就不用这么麻烦了。我们先将activity_main.xml布局文件(几个按钮)从DatabaseTest项目复制到LitePalTest项目中来。
LitePal采取的是对象关系映射(ORM)的模式,什么是对象关系映射呢?简单的说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立的一种映射关系,就是对象关系映射。它赋予我们强大的功能,就是可以用面向对象的思维来操作数据库,而不用再和SQL语句打交道了。使用SQLiteDatabase来创建表时,需要先分析表中应该包括哪些列,然后再编写出一条建表语句,最后在自定义的SQLiteOpenHelper中去执行这条建表语句,但是使用LitePal就不用那么麻烦了:
第一步:定义一个Book类:
第二步:将Book类添加到映射模型列表中,修改:litepal.xml中的代码:
<mapping>标签:声明我们要配置的映射模型类,注意一定要使用完整的类名,不管有多少模型类需要映射,都使用同样的方式配置在<list>标签中即可
第三步:在MainActivity中任意进行一次数据库的操作,数据库就能自动创建了
第四步:运行程序,点击按钮,查看BookStore数据库和book表是否创建成功
拓展:
如果我们想要在book表中添加一个press(出版社)列,直接在Book类中再加一个press字段即可;如果我们想要在建一个Category表,就只需要再新建一个Category类,然后将它添加到映射模型列表中就行了。如下所示:
第一步:在Book类中添加press字段:
第二步:新建Category类
第三步:将该表添加到映射模型列表中(注意修改版本号)
第四步:运行程序,查看表列表:
三、LitePal对数据库进行CRUD操作
3.1、添加数据
首先回顾一下之前添加数据的方法,需要创建一个ContentValues对象,然后将所有要添加的数据put到这个ContentValues对象中,最后调用SQLiteDatabase的:insert()方法将数据添加到数据库表中。
而使用LitePal来添加数据,就简单得多了,我们只需要创建出模型类的实例,再通过对应的set方法把数据设置好,最后调用一下:save()方法就可以了。但是这里需要注意的是:刚刚我们使用LitePal进行表管理操作时模型类没有继承其他类,但是进行CRUD操作时就必须要继承LitePalSupport类才行,因为:save()方法就是来只LitePalSupport类
第一步:将Book类继承LitePalSupport类
第二步:在MainActivity中向Book表中添加数据
第三步:运行程序,查看Book表中的数据,我们可以看到数据已经添加成功
3.2、更新数据(book.updateAll()方法)
方式一:
第一步:在MainActivity中对更新按钮进行功能实现。
第二步:运行程序,点击更新按钮,查看Book表中的数据
方式二:
第一步:修改MainActivity中的代码:
第二步:运行程序,点击更新按钮,查看Book表中的数据
总结:
1、 方式二比方式一更加简洁灵巧
2、updateAll()方法可以指定一个条件约束,和SQLiteDatabase中的:update()方法的where参数部分有点类似,但是更加简洁,如果不指定条件语句的话,就表示更新所有的数据。
3、在使用updateAll()方法时,还有一个非常重要的知识点你需要知晓,就是当你想把一个字段的值更新成默认值时,是不可以使用上面的方式来set数据的。我们知道,在Java中的任何一种数据类型的字段都是会有默认值的,int是0,boolean是false,String是null,当我们new出一个Book对象时,其实所有的字段都已经被初始化成默认值了,如果我们想要把数据库表中的page列更新成0,直接调用book.setPage(0)是不可以的,因为即使不调用这行代码,page字段本身也是0,LitePal此时是不会对这个列进更新的,对于所有想要将数据更新成默认值的操作,LitePal统一提供了一个setToDefault()方法,然后传入相应的列名就可以实现了。比如我们将所有书的页数都更新为0,代码如下:
3.3、删除数据(LitePal.deleteAll()方法)
使用LitePal删除数据的方式主要有两种,第一种比较简单,就是直接调用已存储对象的delete()方法来删除数据。这种方式比较简单,我们就不进行代码演示了,下面看另外一种删除数据的方式:
第一步:在MainActivity中添加删除按钮的点击事件:
第二步:运行程序,点击删除按钮,查看Book表中的数据,我们发现也是为800的“The first Code of Android”这本书已经删除了。
3.4、查询数据(LitePal.findAll()方法)
第一步:给查询按钮添加监听事件,将查询到的数据打印出来
第二步:查看打印结果
拓展:
除了:findAll()方法,LitePal还提供了很多其他非常有用的查询API,如下所示:
我们还可以通过连缀查询来定制更多的查询功能:
对于上面的5个方法,还可以进行任意的连缀组合:
关于LitePal的查询API差不多就介绍到这里,这些API已经足够我们应对绝大多数场景的查询需求了,如果实在有一些特殊需求,上述API满足不了你的时候,LitePal仍然支持使用原生的SQL来进行查询:
Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库的更多相关文章
- Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储
前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...
- Android学习之基础知识九—数据存储(持久化技术)
数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储.SharedP ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Android应用开发基础之三:数据存储和界面展现(三)
生成XML文件备份短信 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.appen ...
- Android学习之基础知识四-Activity活动4讲(Intent传递数据)
Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据. 一.使 ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
- Android学习之基础知识十一 —运用手机多媒体
一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
随机推荐
- 2017 SCNUCPC 解题报告
校内赛题目.解题思路.参考代码一览 A. Blackstorm's Blackstore Problem Description Blackstorm is going to open a black ...
- IntelliJ idea连接操作DB2数据库
一.场景 一直都是用navicat作为数据库的连接工具,但是navicat不支持连接DB2,网上也推荐很多其它软件工具,但是因为DB2用的场景不多,这次只是开发etl工具需要测试数据库,正好发现ide ...
- 每篇半小时1天入门MongoDB——1. MongoDB介绍和安装
目录:ASP.NET MVC企业级实战目录 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据 ...
- Openlayer3之瓦片数据接入
瓦片数据集接入实现思路: 1.构造ol.source.TileImage数据源,构造该数据源需要以下几项: 1)空间参考,通过如下代码构造 2)TileGrid,构造需要以下几项: a)原点 b)分辨 ...
- linux上部署engineercms、docker和onlyoffice实现文档协作
等了好久,这次终于下决心在局域网部署了linux系统,并安装docker和load了onlyoffice,利用engineercms进行资料管理和文档协作. 我整理了完整文档,见我的网盘. engin ...
- 【转】对cocos2d 之autorelease\ratain\release的理解
原文链接:http://blog.sina.com.cn/s/blog_4057ab6201018y4y.html Objective C内存管理进阶(二):理解autorelease: http:/ ...
- 获取元素的最终background-color
一.题目 用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况.(题目copy自网上) 二.题目解析 1.考察底层JavaScript基 ...
- js实现页面锚点定位动画滚动
项目上需要的效果,个人不想用jquery实现,想着用js自己试试,花了点儿时间,终于实现.. 上干货.. function scrollTo(y, duration) { /*y:目标纵坐标,dura ...
- python第二十二天-----在做作业当中............
作业 1, ATM:模拟实现一个ATM + 购物商城程序 额度 自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流水提供还款接 ...
- Windows10 内存泄漏
之前遇到win10开机idle一段时间后, 内存噌噌的往上彪, 16G内存基本什么东西没开就90%多.查了网上的一些解决方案: 方法1. 关闭Ndu服务 sc config Ndu start=dis ...