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

安卓:LitePal操作数据库

目录

一、LitePal介绍

常用方法:

1、插入数据:

2、更新数据:

3、删除数据:

4、查询数据:

二、LitePal的基本用法: 

1、集成LitePal:

 2、创建LitePal配置文件:

3、创建模型类:

 4、增删改查操作:

三、使用例子 

 MainActivity:

activity_main:

litepal.xml: 

运行结果: 

四、异常修复

一、LitePal介绍

        LitePal是一个开源的Android数据库框架,它提供了简单易用的API来帮助开发者进行数据库操作。LitePal允许开发者使用面向对象的方式来操作数据库,而无需编写复杂的SQL语句。

常用方法:

1、插入数据:

  • save():将当前模型对象保存到数据库中。
  • saveAll(Collection models):将指定的模型对象集合保存到数据库中。2

2、更新数据:

  • update():更新当前模型对象在数据库中的数据。
  • updateAll(String... conditions):根据条件更新符合条件的数据。

3、删除数据:

  • delete():删除当前模型对象在数据库中的数据。
  • deleteAll(Class<?> modelClass, String... conditions):根据条件删除符合条件的数据。
  • deleteAll(Class<?> modelClass):删除指定模型类的所有数据。

4、查询数据:

  • find(Class<?> modelClass, long id):根据id查询指定模型类的数据。
  • findFirst(Class<?> modelClass):查询指定模型类的第一条数据。
  • findLast(Class<?> modelClass):查询指定模型类的最后一条数据。
  • findAll(Class<?> modelClass):查询指定模型类的所有数据。
  • where(String... conditions):设置查询条件。
  • order(String... columns):设置查询结果的排序方式。
  • limit(int limit):设置查询结果的数量限制。
  • offset(int offset):设置查询结果的偏移量。
  • average(Class<?> modelClass, String column):计算指定列的平均值。
  • sum(Class<?> modelClass, String column):计算指定列的总和。
  • max(Class<?> modelClass, String column):计算指定列的最大值。
  • min(Class<?> modelClass, String column):计算指定列的最小值。

二、LitePal的基本用法: 

1、集成LitePal:

        首先,在项目的build.gradle文件中添加LitePal的依赖:

dependencies {implementation 'org.litepal.guolindev:core:版本号'
}

 2、创建LitePal配置文件:

        在项目的assets目录下创建litepal.xml文件,并配置数据库名称、版本号等信息。

<?xml version="1.0" encoding="utf-8"?>
<litepal><dbname value="数据库名称" /><version value="数据库版本号" /><list><mapping class="com.example.litepaltest.Book"></mapping><!-- 可以继续添加其他映射配置 -->
</list>
</litepal>

        在AndroidManifest.xml中的代码中,添加android:name = "org.litepal.LitePalApplication"

3、创建模型类:

        创建与数据库表对应的模型类,并继承自LitePalSupport。

import org.litepal.crud.LitePalSupport;public class Book extends LitePalSupport {private int id;private String name;private String author;// 省略getter和setter方法
}

 4、增删改查操作:

  • 插入数据:
Book book = new Book();
book.setName("Android入门");
book.setAuthor("张三");
book.save(); // 将数据保存到数据库中
  • 更新数据:
Book book = new Book();
book.setName("Android进阶");
book.updateAll("name = ?", "Android入门"); // 将名称为"Android入门"的数据更新为"Android进阶"
  • 删除数据:
LitePal.delete(Book.class, id); // 根据id删除指定的数据
LitePal.deleteAll(Book.class, "name = ?", "Android入门"); // 根据条件删除数据
  • 查询数据:
List<Book> bookList = LitePal.findAll(Book.class); // 查询所有数据
Book book = LitePal.findFirst(Book.class); // 查询第一条数据
List<Book> bookList = LitePal.where("author = ?", "张三").find(Book.class); // 根据条件查询数据

三、使用例子 

 MainActivity:

package com.example.litepaldemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;import org.litepal.FluentQuery;
import org.litepal.LitePal;import java.util.List;public class MainActivity extends AppCompatActivity {
String TAG = "MainActivity" ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void CreateDatabase(View view) {// 创建数据库LitePal.getDatabase();}public void addData(View view) {Book book = new Book();book.setId(1);book.setAuthor("柏拉图");book.setName("理想国");book.setPages(259);book.setPrice(9.9);book.save();Book book1 = new Book();book1.setId(2);book1.setAuthor("夸美纽斯");book1.setName("大教学论");book1.setPages(259);book1.setPrice(99.9);book1.save();}public void deleteData(View view) {
//        LitePal.delete(Book.class, 1); // 根据id删除指定的数据LitePal.deleteAll(Book.class, "name = ?", "Android进阶"); // 根据条件删除数据}public void queryData(View view) {List<Book> bookList = LitePal.findAll(Book.class); // 查询所有数据for (Book book : bookList) {Log.d(TAG, "书名: " + book.getName());Log.d(TAG, "作者: " + book.getAuthor());Log.d(TAG, "页数: " + book.getPages());Log.d(TAG, "价格: " + book.getPrice());}}public void modifiedData(View view) {Book book = new Book();book.setName("Android进阶");book.updateAll("name = ?", "大教学论");}
}

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/create_database"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="创建数据库"android:onClick="CreateDatabase"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.13" /><Buttonandroid:id="@+id/add_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="增加数据"android:onClick="addData"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.278" /><Buttonandroid:id="@+id/del_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除数据"android:onClick="deleteData"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.395" /><Buttonandroid:id="@+id/query_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查询数据"android:onClick="queryData"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.512" /><Buttonandroid:id="@+id/motified_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="修改数据"android:onClick="modifiedData"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.651" /></androidx.constraintlayout.widget.ConstraintLayout>

litepal.xml: 

<?xml version="1.0" encoding="utf-8"?>
<litepal><dbname value="BookStore" ></dbname><version value="1" ></version><list><mapping class="com.example.litepaldemo.Book"></mapping></list>
</litepal>

运行结果: 

 四、异常修复

使用LItePal:报错element ‘litepal‘ must be declared和Class referenced in the manifest, `org.litepal.LitePa_敬往事一杯酒哈的博客-CSDN博客

相关文章:

安卓:LitePal操作数据库

目录 一、LitePal介绍 常用方法&#xff1a; 1、插入数据&#xff1a; 2、更新数据&#xff1a; 3、删除数据&#xff1a; 4、查询数据&#xff1a; 二、LitePal的基本用法&#xff1a; 1、集成LitePal&#xff1a; 2、创建LitePal配置文件&#xff1a; 3、创建模型类…...

【JavaEE初阶】了解JVM

文章目录 一. JVM内存区域划分二. JVM类加载机制2.1 类加载整体流程2.2 类加载的时机2.3 双亲委派模型(经典) 三. JVM垃圾回收机制(GC)3.1 GC实际工作过程3.1.1 找到垃圾/判定垃圾1. 引用计数(不是java的做法,Python/PHP)2. 可达性分析(Java的做法) 3.1.2 清理垃圾1. 标记清除2…...

基于vue2.0和elementUi的vue农历日期组件vue-jlunar-datepicker(插件)

vue-jlunar-datepicker&#xff08;插件&#xff09; vue实现农历日历插件——vue-jlunar-datepicker插件 这个插件本身是基于vue2.0和elementUi框架来实现的。 安装 vue-jlunar-datepicker 插件 npm install vue-jlunar-datepicker --save // 如果安装过程中&#xff0c;出现…...

Python爬虫——selenium_元素定位

元素定位&#xff1a;自动化要做的就是模拟鼠标和键盘来操作这些元素&#xff0c;点击&#xff0c;输入等等。操作这些元素前首先要找到它们&#xff0c;WebDriver提供很多定位元素的方法 from selenium import webdriver# 创建浏览器对象 path files/chromedriver.exe brows…...

短视频内容平台(如TikTok、Instagram Reel、YouTube Shorts)的系统设计

现在&#xff0c;短视频内容已成为新趋势&#xff0c;每个人都在从TikTok、Instagram、YouTube等平台上消费这些内容。让我们看看如何为TikTok创建一个系统。 这样的应用程序看起来很小&#xff0c;但在后台有很多事情正在进行。以下是相关的挑战&#xff1a; •由于该应用程序…...

【git】Git 回退到指定版本:

文章目录 方法一: 使用 git reset 命令方法二&#xff1a;使用 git revert 命令方法三&#xff1a;使用 git checkout 命令常见的错误及其解决办法如下&#xff1a; 方法一: 使用 git reset 命令 命令可以将当前分支的 HEAD 指针指向指定的提交&#xff0c;从而回退代码到指定版…...

kibana+nginx配置密码 ubuntu

JAVA进阶之路-nginx设置密码 Kibana——通过Nginx代理Kibana并实现登陆认证 需要配置一下nginx文件 nginx配置文件详解 密码生成安装软件 apt install apache2-utils...

Git仓关联多个远程仓路径

前言 Git仓如果需要将代码push到多个仓&#xff0c;常用的做法是添加多个远程仓路径&#xff0c;然后分别push。这样虽然可以实现目的&#xff0c;但是需要多次执行push指令&#xff0c;很麻烦。 本文介绍关联多个远程仓路径且执行一次push指令的方法&#xff1a;git remote …...

使用ffmpeg将m4a及wav等文件转换为MP3格式

要使用ffmpeg将m4a及wav等文件转换为MP3格式&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装 ffmpeg 确保您已经安装了ffmpeg软件。如果没有安装&#xff0c;请访问ffmpeg的官方网站https://ffmpeg.org/ 并按照说明进行安装。 Win10 / Win11 可以通过 winget 命令…...

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型&#xff08;本文所阐述的分支模型&#xff09;构思于 2010 年&#xff0c;也就是 Git 诞生后不久&#xff0c;距今已有 10 多年。在这 10 多年中&#xff0c;Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里&#xff0c;Git 本身…...

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…...

prometheus部署

一、前言 Prometheus 是一个开源的系统监控和警报工具&#xff0c;用于收集、存储和查询时间序列数据。它旨在提供高效的多维数据收集和查询功能&#xff0c;帮助用户监控其应用程序和基础设施的性能&#xff0c;并在出现问题时触发警报&#xff0c;总来得说prometheus是用来收…...

Flink-Window详细讲解-countWindow

一.countWindow和countWindowall区别 1.countWindow&#xff1a; 如果您使用 countWindow(5)&#xff0c;这意味着您将数据流划分成多个大小为 5 的窗口。划分后的窗口如下&#xff1a; 窗口 1: [1, 2, 3, 4, 5]窗口 2: [6, 7, 8, 9, 10] 当每个窗口中的元素数量达到 5 时&…...

React 18 state 如同一张快照

参考文章 state 如同一张快照 也许 state 变量看起来和一般的可读写的 JavaScript 变量类似。但 state 在其表现出的特性上更像是一张快照。设置它不会更改已有的 state 变量&#xff0c;但会触发重新渲染。 设置 state 会触发渲染 可能会认为用户界面会直接对点击之类的用…...

EasyPoi导出 导入(带校验)简单示例 EasyExcel

官方文档 : http://doc.wupaas.com/docs/easypoi pom的引入: <!-- easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dep…...

八大排序

目录 选择排序-直接插入排序 插入排序-希尔排序 选择排序-简单选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序 归并排序 基数排序 选择排序-直接插入排序 基本思想: 如果碰见一个和插入元素相等的&#xff0c;那么插入元素把想插入的元素放在相等元素…...

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 掌握技术的听说也需要心怀正义&#xff0c;不要利用技术行不轨之事&…...

【网络通信】socket编程——TCP套接字

TCP依旧使用代码来熟悉对应的套接字&#xff0c;很多接口都是在udp中使用过的 所以就不会单独把他们拿出来作为标题了&#xff0c;只会把第一次出现的接口作为标题 文章目录 服务端 tcp_servertcpserver.hpp(封装)初始化 initServer1. 创建socket2. 绑定 bindhtons —— 主机序…...

ROS2系统学习番外篇2---用VSCode开发ROS2程序

在ROS2系统学习3—第一个“Hello World”程序—即工作空间创建与包创建中已经介绍了如何创建ROS的工作空间以及包。在开发大型工程时,往往需要在IDE下面进行开发,因此本篇介绍使用VSCode来搭建ROS2开发环境的方法。 首先用VSCode打开ROS2的工作空间。 使用快捷键编译ROS2 …...

06 - Stream如何提高遍历集合效率?

前面我们讲过 List 集合类&#xff0c;那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中&#xff0c;Collection 新增了两个流方法&#xff0c;分别是 Stream() 和 parallelStream()。 1、什么是 Stream&#xff1f; 现在很多大数据量系统中都存在分表分库的情况…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...