4、Android-数据存储方案(使用LitePal操作数据库)
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操作数据库)的更多相关文章
- Android数据存储之SQLite的操作
Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...
- Android数据存储之GreenDao 3.0 详解
前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...
- Android Learning:数据存储方案归纳与总结
前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- 10、Android数据存储
课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...
- Sqlserver 高并发和大数据存储方案
Sqlserver 高并发和大数据存储方案 随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高! ...
随机推荐
- Best MVC Practices 最佳的MVC实践
Although Model-View-Controller (MVC) is known by nearly every Web developer, how to properly use MVC ...
- yum卸载
完全卸载依赖 -- 正常安装 yum install sl -- 列出操作 yum history list sl -- 根据显示install操作的id进行删除 yum history undo { ...
- ssm项目快速搭建(注解)
dao层配置 dao层配置注意事项: 1.Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同 2.Mapper.xml 接口方法名和 Mapper.xml 中定义的 ...
- 文件上传(Servlet/Struts2/SpringMVC)
文件下载(Servlet/Struts2)的链接:http://www.cnblogs.com/ghq120/p/8328093.html 文件上传 Servlet实现 要实现文件上传的功能,必须在f ...
- python中logging日志基本用法,和进程安全问题
低配版 import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 正常运转模式 loggi ...
- 虚树(Bzoj3611: [Heoi2014]大工程)
题面 传送门 虚树 把跟询问有关的点拿出来建树,为了方便树\(DP\) 在\(LCA\)处要合并答案,那么把这些点的\(LCA\)也拿出来 做法:把点按\(dfs\)序排列,然后求出相邻两个点的\(L ...
- JavaWeb学习总结(三):Servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- 【MFC】CDialogBar中按钮不可用
现象展示: 具体原因: A button in a CDialogBar object is disabled automatically if the command routing does no ...
- Node.js 优雅地自动审核团队的代码
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 简介 在团队开发中,无论是写前端(js,css,htm ...
- Using Apache Spark and MySQL for Data Analysis
What is Spark Apache Spark is a cluster computing framework, similar to Apache Hadoop. Wikipedia has ...