当前位置: 首页 > 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;…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...