安卓数据存储——SQLite

一、SQLite数据库

创建表

	CREATE TABLE IF NOT EXISTS user_info (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name VARCHAR NOT NULL,age INTEGER NOT NULL,height LONG NOT NULL,weight FLOAT NOT NULL);
注:
  • IF NOT EXISTS:如果该表不存在则创建,若存在该表则不创建
  • AUTOINCREMENT:自动增长
  • sqlite数据库不支持布尔类型,如果直接存布尔类型会被自动转为数字 0(false)、1(true)

删除表

	DROP TABLE IF EXISTS user_info;
注:
  • IF EXISTS:如果该表存在则删除

修改表结构

	ALTER TABLE user_info ADD COLUMN phone VARCHAR;
注:
  • sqlite只支持增加字段,不支持修改、删除字段
  • sqlite每次只能添加一个字段,若要添加多个字段,需分多次添加

添加记录

	INSERT INTO user_info ( name, age, height, weight, phone )VALUES( '张三', 18, 180, 70.2, 1101201120 );

删除记录

	DELETE FROMuser_info WHEREname = '张三';

修改记录

	UPDATE user_info SET height = 188 WHEREname = '张三';

查询记录

	SELECT * FROM user_info ORDER BY age ASC;
注:

ORDER BY:根据age字段排序
ASC:升序
DESC:降序

二、SQLiteDatabase数据库管理器

SQLiteDatabase是SQLite的数据库管理类,它提供了若干操作数据表的API,常用的方法有3类。

管理类主要API

  • openDatabase:打开指定路径的数据库
  • isOpen:判断数据库是否已打开
  • close:关闭数据库
  • getVersion:获取数据库的版本号
  • setVersion:设置数据库的版本号

创建数据库

String mDatabaseName = getFilesDir() + "/test.db";
SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE, null);

删除数据库

boolean result = deleteDatabase(mDatabaseName);

案例代码

注:
  • getFilesDir():返回该包下的files路径(/data/data/包名/files/)在这里插入图片描述

三、SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。

数据处理类主要API

  • execSQL:执行拼接好的SQL语句
  • delete:删除符合条件的记录
  • update:更新符合条件的记录
  • insert:插入一条记录
  • query:执行查询操作,返回结果集的游标
  • rawQuery:执行拼接好的SQL查询语句,返回结果集的游标

创建步骤

  • 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
  • 封装保证数据库安全的必要方法
  • 提供对表记录进行增加、删除、修改、查询的操作方法。
public class UserDBHelper extends SQLiteOpenHelper {private static final String DB_NAME = "user.db";private static final String TABLE_NAME = "user_info";private static final int DB_VERSION = 1;private static UserDBHelper mHelper = null;private SQLiteDatabase mRDB = null;private SQLiteDatabase mWDB = null;private UserDBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}//单例public static UserDBHelper getInstance(Context context) {if (mHelper == null) {mHelper = new UserDBHelper(context);}return mHelper;}
}

在onCreate中创建表

    // 创建数据库,执行建表语句@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "name VARCHAR NOT NULL);";db.execSQL(sql);}

SQLiteDatabase对数据库操作分为读和写,所以要提供两个实例

    private SQLiteDatabase mRDB = null;private SQLiteDatabase mWDB = null;

读连接:getReadableDatabase()

    public SQLiteDatabase openReadLink() {if (mRDB == null || !mRDB.isOpen()) {mRDB = mHelper.getReadableDatabase();}return mRDB;}

写连接:getWritableDatabase()

    public SQLiteDatabase openWriteLink() {if (mWDB == null || !mWDB.isOpen()) {mWDB = mHelper.getWritableDatabase();return mWDB;}return mWDB;}

关闭连接

    public void closeLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;}}

添加

    public long insert(User user) {ContentValues values = new ContentValues();values.put("name", user.name);//执行插入记录动作,该语句返回插入记录的行号//如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,//为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),//倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。//如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。return mWDB.insert(TABLE_NAME, null, values);}

删除

    public long deleteByName(User user) {
//        删除多个 name=? and age=?
//        删除所有 1=1return mWDB.delete(TABLE_NAME, "name=?", new String[]{user.name});}

修改

    public long update(User user) {ContentValues values = new ContentValues();values.put("name", user.name);return mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name});}

查询

    public List<User> queryAll() {List<User> list = new ArrayList<>();Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null);while (cursor.moveToNext()) {User user = new User();user.id = cursor.getInt(0);user.name = cursor.getString(1);list.add(user);}return list;}
注:
  • Cursor:游标

使用

public class SQLiteHelperActivity extends : {private UserDBHelper mHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite_helper);Button save = findViewById(R.id.save);save.setOnClickListener(view -> {User user = new User("张三");
//            插入
//            long res = mHelper.insert(user);//            删除
//            long res = mHelper.deleteByName(user);//            修改
//            long res = mHelper.update(user);//            查询List<User> list=mHelper.queryAll();for(User u: list){Log.d("AAA",u.toString());}if (res > 0) {ToastUtil.show(this, "success");}});}@Overrideprotected void onStart() {super.onStart();mHelper = UserDBHelper.getInstance(this);
//        打开数据库读写连接mHelper.openWriteLink();mHelper.openReadLink();}@Overrideprotected void onStop() {super.onStop();mHelper.closeLink();}
}

事务

事务类主要API

  • beginTransaction:开始事务
  • setTransactionSuccessful:设置事务的成功标志
  • endTransaction:结束事务
    public long insert(User user) {ContentValues values = new ContentValues();values.put("name", user.name);try {//开始一个事务mWDB.beginTransaction();mWDB.insert(TABLE_NAME, null, values);mWDB.insert(TABLE_NAME, null, values);//标记事务成功mWDB.setTransactionSuccessful();} catch (Exception e) {e.printStackTrace();} finally {//标记事务结束        mWDB.endTransaction();}return 1;}

数据库更新

	private static final int DB_VERSION = 1;private UserDBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}

当 DB_VERSION 改变时给表添加两个字段

    @Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {String sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;";db.execSQL(sql);sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN password VARCHAR;";db.execSQL(sql);}

UserDBHelper代码案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147420.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

后端:理解与创建项目

理解 项目得放到tomcat中才能运行 &#xff0c;所以请求不是到服务端&#xff0c;是到具体的项目里的服务生里(servlet)。 servlet能够响应接受请求。 用jqueryajax发出请求 请求&#xff08;请求路径-->找到服务生&#xff09;&#xff0c; 请求方式&#xff08;get/post&…

【深入理解SpringCloud微服务】深入理解nacos配置中心(六)——spring-cloud-context关于配置刷新的公共逻辑

【深入理解SpringCloud微服务】深入理解nacos配置中心&#xff08;六&#xff09;——spring-cloud-context关于配置刷新的公共逻辑 原理分析源码解析RefreshEventListener#onApplicationEvent(ApplicationEvent)ContextRefresher#refresh()ContextRefresher#refreshEnvironmen…

Spring IDEA 2024 安装Lombok插件

1.简介 Lombook插件的Data标签可以自动生成类的get和set以及toString方法。 2.安装步骤 在idead设置的插件中搜索lombok插件&#xff0c;安装。 在Spring项目的pom.xml中添加依赖项 <dependency><groupId>org.projectlombok</groupId><artifactId…

2024年研赛 C、D、F三题论文首发+部分代码分享

本届研赛助攻题目 C D F三题论文均已经全部完成。后更新计划 如图所示。 免费给大家分享 三个问题的论文部分代码 2024年华为杯-研赛分享资料&#xff08;论文部分代码&#xff09;&#xff08;已更新部分代码&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com…

【HTML样式】加载动画专题 每周更新

加载动画专题 煎蛋加载动画方块移动加载动画电子风变脸正方体组合跳跃式加载动画 煎蛋加载动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备&#xff0c;但当用于机器人的大面积覆盖时&#xff0c;它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作&#xff0c;使用内部高分辨率关节力扭矩传感器&#xff0c;在机械臂中实现了固有的全身…

读构建可扩展分布式系统:方法与实践11强一致性

1. 强一致性 1.1. 最终一致数据库通过跨多台机器分区和复制数据集来获得可扩展性&#xff0c;其代价是要跨副本维持强数据一致性以及允许冲突写入 1.1.1. 在更新数据对象后&#xff0c;不同的客户端可能会看到该对象的旧值或新值&#xff0c;直到所有副本都收敛到最新值 1.2…

UDS诊断ISO14229新手入门篇

前言:参考ISO-14229 UDS 诊断教程(一) UDS 由 ISO-14229 系列标准定义,ISO 14229-1 定义了诊断服务,不涉及网络及实现,只有应用层的内容。而 ISO 14229-3 则定义了 UDS 在 CAN 总线上的实现。诊断通信的过程从用户角度来看非常容易理解,诊断仪发送诊断请求(request),…

MQ入门(一):同步调用和异步调用--RabbitMQ基础入门

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装部署 2.2.RabbitMQ基本架构 2.3.收发消息 2.3.1.交换机 2.3.2.队列 2.3.3.绑定关系 2.3.4.发送消息 2.4.数据隔离 2.4.1.用户管理 2.4.2.virtual host 1.初识MQ 微服务一旦拆分&…

DIN模型实现推荐算法

1. 项目简介 项目A030-DIN的核心是通过深度学习技术实现个性化推荐算法&#xff0c;旨在为用户提供精准、高效的商品或内容推荐。在现代电子商务、社交媒体及内容平台中&#xff0c;推荐系统作为核心功能&#xff0c;极大地提升了用户体验。DIN&#xff08;Deep Interest Netw…

Codeforces Round 973 (Div. 2) - D题

传送门&#xff1a;Problem - D - Codeforces 题目大意&#xff1a; 思路&#xff1a; 尽量要 最大值变小&#xff0c;最小值变大 即求 最大值的最小 和 最小值的最大 -> 二分答案 AC代码&#xff1a; 代码有注释 #include<bits/stdc.h> using namespace std; #…

无人机+自组网:中继通信增强技术详解

无人机与自组网技术的结合&#xff0c;特别是通过中继通信增强技术&#xff0c;为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析&#xff1a; 一、无人机自组网技术概述 无人机自组网技术是一种利用无人机作为节点&#xff0c;通过无…

指针修仙之实现qsort

文章目录 回调函数什么是回调函数回调函数的作用 库函数qsort使用qsort函数排序整形使用qsort函数排序结构体 qsort函数模拟实现说明源码and说明 回调函数 什么是回调函数 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

深度学习02-pytorch-01-张量的创建

深度学习 pytorch 框架 是目前最热门的。 深度学习 pytorch 框架相当于 机器学习阶段的 numpy sklearn 它将数据封装成张量(Tensor)来进行处理&#xff0c;其实就是数组。也就是numpy 里面的 ndarray . pip install torch1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simp…

蓝桥杯【物联网】零基础到国奖之路:七. 串口

蓝桥杯【物联网】零基础到国奖之路:七. 串口 第一节 串口通信理论第二节 软件通信协议第三节 DMA理论第四节 CubeMX的配置第五节 代码模版 第一节 串口通信理论 通用异步收发传输器&#xff08;UART&#xff09;是一种串行异步收发协议&#xff0c;应用十分广泛。UART将数据二…

HashMap扩容时机是插入前还是插入后?

结论 不管是HashMap还是ConcurrentHashMap都是插入后。 过程为&#xff1a; 先计算哈希值。对应的哈希槽插入数据&#xff0c;决定是红黑树还是链表插入完毕才计算是否需要扩容&#xff0c;假如需要则扩容 源码 源码如下&#xff1a; 其中addCount方法里面写入扩容。

Dash稳定版更新

大家好&#xff0c;今天要和大家聊聊一个开发Python网页应用的超级神器——Dash 2.18.1稳定版本正式发布啦&#xff01;此次更新&#xff0c;针对2.18.0版本的问题进行了修复和优化&#xff0c;为我们带来了更为稳定、强大的开发体验。 Dash是什么&#xff1f; Dash是一款基于P…

深度学习03-神经网络02-激活函数

可以使用这个进行跳转链接​​​​​​​http://playground.tensorflow.org/#activationrelu&batchSize11&datasetspiralDatasetreg-gauss&learningRate0.01ularizationRate0.1&noise0&networkShape7,5,4,3,2&seed0.54477&showTestDatafalse&d…

Excel VLOOKUP函数怎么用?vlookup函数的使用方法及案例

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f50e; 在Excel的世界里&#xff0c;VLOOKUP函数无疑是查询和数据分析中的明星。无论是从庞大的数据表中提取特定信息&#xff0c;还是进行数据的快速匹配&#xff0c;VLOOKUP都能大显身手。今天&#xff0c;我们将深…

第15章 程序的动态加载和执行

第15章 程序的动态加载和执行 该章节讲解了MBR加载内核&#xff0c;然后内核加载用户程序这样一套流程&#xff0c;模拟操作系统的工作原理。 本章代码清单 本章的代码实现的功能位&#xff1a;主引导扇区加载内核&#xff0c;内核加载用户程序&#xff0c;用户程序通过调用…