当前位置: 首页 > news >正文

Android学习之路(16) Android 数据库Litepal

一.LitePal的介绍

Litepal是Android郭霖大神的一个开源Android数据库的开源框架,它采用了对象关系映射(ORM)的模式,这是让我们非常好的理解的数据库,一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法,就算对SQL语句的了解很少,也能很好的建立起数据库,以及各种增删改查的操作。Litepal官方链接.

二.Litepal的配置

1.添加依赖

首先去官方地址中找到当前最新的依赖,并在我们项目的dependencies下添加:目前我最新版本是3.2.3

dependencies {implementation 'org.litepal.guolindev:core:3.2.3'
}

2.配置Litepal

一定要先去我们的项目AndroidManifest.xml下配置我们的数据库,这样我们的Litepal才能正常工作,加上android:name=“org.litepal.LitePalApplication”:

<manifest><applicationandroid:name="org.litepal.LitePalApplication"...>...</application>
</manifest>

如果你已经有了自己的Application的configure在这,例如:

<manifest><applicationandroid:name="com.example.MyApplication"...>...</application>
</manifest>

那你可以在你的Myapplication中加上LitePal.initialize(this);,来初始化配置。

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();LitePal.initialize(this);}...
}

3.创建litepal.xml文件

右击app/src/main 目录->new Directory,创建一个assets目录,然后再在该目录下new File一个litepal.xml文件,接着编辑里面的内容:

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

dbname 标签用来指定数据库的名称 version 标签是指定数据库版本,更新表的时候需要增大该值 list 标签是用来指定我们的映射模型,也就是将我们实体类的路径用 mapping标签放进来
到现在为止我们的litepal配置工作就全部完成了,接下来就来正式使用吧

三.Litepal的使用

1.创建数据库

首先定义我们的实体类,这里我就简单化,先定义一个News新闻类和一个内容类Content:
在我们对实体类进行数据库操作之前,一定要先让我们数据库知道哪些是我们的实体类,可以对其进行操作,故而需要让我们的实体类先继承LitepalSupport这个类!!!

public class News extends LitepalSupport{private int id;@Column(unique = true, defaultValue = "unknown")private String title;private String Content;//getter , setter 方法//...
}
public class Comment extends LitepalSupport{private int id;@Column(nullable = false)private String content;//getter , setter 方法//...
}

这里就是典型的两个javaBean类,定义了新闻的id,标题,内容,评论类的id 和内容,以及他们的getter 和 setter的方法。还有一些限定类的一些注解。这里你是不是感觉到了关系映射的最直观的体验了吧!

定义好实体类,一定不要忘记添加到映射模型的列表当中,修改litepal.xml文件

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

这样我们只需要对数据库随便进行一次操作就能初始化数据库啦,我们一般可以调用Litepal.getDatabase() 方法。
怎么看是否成功了呢?
我们可以通过Android Studio的View ->ToolsWindows -> Device File Explorer
然后进入 data/data/< 包名 > / databases 下回生成两个文件,其中一个是以db结尾的,这就是我们的数据库文件,如果想要看其中的内容,就需要通过db shell 查看数据库的创建情况了,这我就不多展开了,想看的朋友自己去看一下。

2.升级数据库

比如现在我们的News 类需要和 Comment建立一个关系映射,是一对多的关系,也就是一个News类可以有多个Comment类对应,这样我们就可以修改类:

public class News{private int id;@Column(unique = true, defaultValue = "unknown")private String title;private String Content;private List<Comment> commentList = new ArrayList<>();//getter , setter 方法//...
}
public class Comment{private int id;@Column(nullable = false)private String content;private News news;//getter , setter 方法//...
}

这样,我们在News类中加上了private List commentList = new ArrayList<>();,这里特别注意commentList要先自己实例化,方便我们后面对comment的存储,而对应的Comment是只对应我们一个News的,故而其里面加上private News news;

修改了实体类,我们要怎么通知数据库去更新呢?很简单,我们只需要把litepal.xml里面的版本号加1就行了!value=1 -> value=2

<?xml version="1.0" encoding="utf-8"?>
<litepal><dbname value="NewsDemo" /><version value="2" /><list><mapping ></mapping><mapping ></mapping></list></litepal>

3.Litepal的CRUD

①添加数据

Comment comment1 = new Comment();
comment1.setContent("太不道德了吧!");
comment1.save();Comment comment2 = new Comment();
comment2.setContent("这新闻真让人汗颜!");
comment2.save();News new = new News();
new.setTitle("日本核污水");
new.setContent("日本决定把核污水排入海洋");
new.getCommentList().add(comment1);
new.getCommentList().add(comment2);
new.save();

注意事项

首先第一点,调用save()方法,将我们的实体类对象保存到Litepal数据库中 接着,News 类中和Comment类中的id是不需要我们指定的,框架会帮我们自动生成 指定两个类的映射关系后,这里指一对多的关系,多的那个类(Comment)里面的news对象是不需要我们来设置的,它在数据库中会自动转变成一个news_id字段,该字段指明了它是对应在那个News中的评论,调用new.getCommentList().add(comment1)的时候,Litepal框架会帮我们自动设置好这两个类的映射关系。 在我们要查询特定News对象中有哪些评论的时候,可以这样查,根据你这个对象的id,去匹配所有comment的news_id:

List<Comment> commentList = LitePal.where("news_,String.valueOf(news.getId())).find(Comment.Class);

②查询数据

//查询所有的new
List<News> newList  = LitePal.findAll(News.class);//根据指定条件查询
//
List<News> newList1  = LitePal.where("title=? and content=?","日本核污水","日本决定把核污水排入海洋").find(News.class);

③更新数据

//第一种方式:
News news = new News();
news.setContent("排污水进海洋太可恶了!!");
news.upDateAll("title=?","日本核污水").find(News.class);//第二种方式:
News news = LitePal.find(News.class,1); //1指id号
news.setContent("排污水进海洋太可恶了!!");
news.save();//第三种方式
News news = new News();
news.setContent("排污水进海洋太可恶了!!");
news.update(id);

④删除数据

//第一种
LitePal.deleteAll(News.class,"title=?","日本核污水");//第二种
LitePal.delete(News.class,id);

4.使用多个数据库:

第一种方法:代码方式创建

LitePalDB litePalDB = new LitePalDB("otherDataBase", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB);

第二种:用类似litepal.xml创建,这里是otherDataBase.xml:

LitePalDB litePalDB = LitePalDB.fromDefault("otherDataBase");
LitePal.use(litePalDB);

随时切换回默认数据库: LitePal.useDefault();
删除数据库: LitePal.deleteDatabase(“otherDataBase”);

四.总结

LitePal关系型数据库用起来还是很简单明了的,如果你对文章有什么疑惑或者指正,欢迎评论区留言!如果你觉得文章对你有帮助的话,点个赞或者收藏都是对笔者最大的支持!感谢!

相关文章:

Android学习之路(16) Android 数据库Litepal

一.LitePal的介绍 Litepal是Android郭霖大神的一个开源Android数据库的开源框架&#xff0c;它采用了对象关系映射&#xff08;ORM&#xff09;的模式&#xff0c;这是让我们非常好的理解的数据库&#xff0c;一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法&a…...

Redis持久化(RDB/AOF)

"在哪里走散&#xff0c;你都会 找 到 我。" 认识持久化 我们在接触Mysql事务的时候&#xff0c;一定了解过Mysql事务的四个特性: "原子性(A)一致性(C)隔离性(I)持久性(D)" 而其中持久性其实与持久化是一回事&#xff0c;所谓持久与不持久&#x…...

小谈设计模式(15)—观察者模式

小谈设计模式&#xff08;15&#xff09;—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject&#xff08;被观察者&#xff09;ConcreteSubject&#xff08;具体被观察者&#xff09;Observer&#xff08;观察者&#xff09;ConcreteObserver&#xff0…...

简单工厂模式 创建型模式(非GoF经典设计模式)

简单工厂模式是属于创建型模式&#xff0c;也因为工厂中的方法一般设置为静态&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工…...

PE文件之导入表

1. 导入表 2. 显示导入表信息的例子 ; 作用: 将RVA地址转成FOA即文件偏移 ; 参数: _pFileHdr 指向读到内存中文件的基址指针 ; _dwRVA 目标RVA地址 ; 返回: 目标RVA转成文件偏移的值 RVA2FOA PROC USES esi edi edx, _pFileHdr:PTR BYTE, _dwRVA:DWORDmov esi, _pFil…...

二、码制及其转换

原码 根据我们所学可知&#xff0c;数字电路的逻辑电路是通过输出0和1来表示二进制数的&#xff0c;那么这个二进制数的正负又该怎么表示呢&#xff1f; 答案是在这个二进制数的最高位作为符号位来表示正负性&#xff0c;用0正数&#xff0c;用1表示负数&#xff0c;在这种表达…...

在pycharm中出现下载软件包失败的解决方法

一. 一般情况下我们会选择在设置中下载软件包,过程如下. 1. 直接点击左上角的文件, 再点击设置, 再点击项目, 在右边选择python解释器,点击号,输入要下载的软件包, 在下面的一系列的包中选择相对应的包,点击安装就可以了,有的时候我们下载的是最新的版本,如果要下载固定的版本…...

10.0 探索API调试事件原理

本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能&#xff0c;首先简单介绍一下关于调试事件的相关信息&#xff0c;调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构&#xff0c;该结构用于向调试器报告调试事件。当一个程序发生异常事件或者…...

文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题

二、用go语言&#xff0c;说明如何在一个数组 A[1…n]中实现两个栈&#xff0c;使得当两个栈的元素个数之和不为 n 时&#xff0c;两者都不会发生上溢。要求 PUSH 和 POP 操作的运行时间为 O(1)。 文心一言&#xff1a; 在这个问题中&#xff0c;我们要在一个数组 A[1…n] 中…...

检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…...

vtk 动画入门 1 代码

实现效果如图&#xff1a; #include <vtkAutoInit.h> //VTK_MODULE_INIT(vtkRenderingOpenGL2); //VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); //VTK_MODULE_INIT(vtkRenderingFreeType); #in…...

【VR】【unity】如何在VR中实现远程投屏功能?

【背景】 目前主流的VD应用,用于娱乐很棒,但是用于工作还是无法效率地操作键鼠。用虚拟键盘工作则显然是不现实的。为了让自己的头显能够起到小面积代替多显示屏的作用,自己动手开发投屏VR应用。 【思路】 先实现C#的投屏应用。研究如何将C#投屏应用用Unity 3D项目转写。…...

OpenGl材质

在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter),因而产生较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的…...

背包问题

目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…...

JavaSE | 初始Java(十一) | 抽象类和抽象接口

抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c; 如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类 在 Java 中&#xff0c;一个…...

产品经理如何科学的进行需求调研?

导语&#xff1a;作为产品经理&#xff0c;需求调研是开展工作的重要环节之一。科学、有效地进行需求调研不仅可以帮助产品经理更好地了解用户需求&#xff0c;还能指导产品设计和功能开发&#xff0c;提升产品的竞争力。本文将介绍几种科学的方法和技巧&#xff0c;帮助产品经…...

AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图…...

玩具玩偶配送经营商城小程序的作用是什么?

玩具玩偶是小孩子们喜欢的产品&#xff0c;其市场需求度很高&#xff0c;以前玩具店里总是不缺乏客户&#xff0c;但现在随着人们生活品牌提升及消费形式改变&#xff0c;无论玩具厂商还是门店经销商都面对着不少痛点&#xff1a; 如拓客引流难、线上销售经营难、营销难、分销…...

latex表格内容换行

问题描述&#xff1a; 在用latex表格中编写公式时&#xff0c;可能出现公式太长&#xff0c;表格中后面的内容不能在文档中呈现&#xff0c;如下图1&#xff0c;故要进行行内内容的换行&#xff0c;使内容呈现完全而传统的\换行后,换行内容会顶格&#xff0c;如图2。 解决方…...

2023 牛客国庆day4 【10.2训练补题】

目录 B-Basic Gcd Problem&#xff08;素数筛快速幂&#xff09; H-Harder Gcd Problem&#xff08;素数&#xff09; B-Basic Gcd Problem&#xff08;素数筛快速幂&#xff09; 打表找规律发现答案为 (n质因子数目)^c #include<bits/stdc.h> using namespace std;…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...