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

[Android Studio]Android 数据存储--SQLite数据库存储

 🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪


Topic 

发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。

📋笔记目录

💯实战演练--基于SQLite数据库的通讯录实现数据的增删改查

1,创建程序

2,放置界面控件

3,编写界面交互代码

4, 核心方法讲解

5,数据库的创建及初始化

6,运行程序

🚩结尾


💯实战演练--基于SQLite数据库的通讯录实现数据的增删改查


1,创建程序

创建一个名为Directory的应用程序,指定报名为cn.example.directory。

2,放置界面控件

在activity_main.xml布局文件中放置三个TextView控件,分别用于显示"姓名"文本、“电话”文本以及显示保存的姓名和电话信息,两个EditText控件分别用于显示姓名的输入框与电话的输入框,四个Button控件分别用于显示添加按钮、查询按钮、修改按钮以及删除按钮。

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:padding="16dp"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="130dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="姓 名:"android:textSize="18sp" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/et_name"android:hint="请输入姓名:"android:textSize="16sp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="电 话:"android:textSize="18sp"/><EditTextandroid:id="@+id/et_phone"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入手机号码:"android:textSize="16sp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/btn_add"android:layout_marginRight="2dp"android:layout_weight="1"android:background="#B9B9FF"android:text="添加"android:textSize="18sp"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/btn_query"android:layout_marginRight="2dp"android:layout_weight="1"android:background="#DCB5FF"android:text="查询"android:textSize="18sp"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/ben_update"android:layout_marginRight="2dp"android:layout_weight="1"android:background="#E6CAFF"android:text="修改"android:textSize="18sp" /><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:id="@+id/btn_delete"android:layout_weight="1"android:background="#ACD6FF"android:text="删除"android:textSize="18sp"/></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/tv_show"android:layout_marginTop="25dp"android:textSize="20sp"/></LinearLayout>

3,编写界面交互代码

在MainActivity中编写逻辑代码,实现联系人信息的添加、查询、修改以及删除功能,由于通讯录界面上的添加、查询、修改、删除按钮需要设置点击事件,因此将MainActivity实现OnClickListener接口,并重写Onclick方法,在该方法中实现这四个按钮的点击事件。

package com.example.directory;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {MyHelper myHelper;private EditText mEtName;private EditText mEtphone;private TextView mTvShow;private Button mBtnAdd;private Button mBtnQuery;private Button mBtnUpdate;private Button mBtnDelete;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myHelper = new MyHelper(this);init();}private void init() {mEtName = findViewById(R.id.et_name);mEtphone = findViewById(R.id.et_phone);mTvShow = findViewById(R.id.tv_show);mBtnAdd = findViewById(R.id.btn_add);mBtnQuery = findViewById(R.id.btn_query);mBtnUpdate = findViewById(R.id.ben_update);mBtnDelete = findViewById(R.id.btn_delete);mBtnAdd.setOnClickListener(this);mBtnQuery.setOnClickListener(this);mBtnUpdate.setOnClickListener(this);mBtnDelete.setOnClickListener(this);}@Overridepublic void onClick(View v) {String name,phone;SQLiteDatabase db;ContentValues values;switch (v.getId()){case R.id.btn_add:name = mEtName.getText().toString();phone = mEtphone.getText().toString();db = myHelper.getWritableDatabase();values = new ContentValues();values.put("name",name);values.put("phone",phone);db.insert("information",null,values);Toast.makeText(this,"信息已添加",Toast.LENGTH_SHORT).show();db.close();break;case R.id.btn_query:db = myHelper.getReadableDatabase();Cursor cursor = db.query("information",null,null,null,null,null,null);if (cursor.getCount() == 0){mTvShow.setText("");Toast.makeText(this,"没有数据",Toast.LENGTH_SHORT).show();}else {cursor.moveToFirst();mTvShow.setText("Name : " + cursor.getString(1) + " ;  Tel : " + cursor.getString(2));}while (cursor.moveToNext()){mTvShow.append("\n" + "Name : " + cursor.getString(1) + " ; Tel : " + cursor.getString(2));}cursor.close();db.close();break;case R.id.ben_update:db = myHelper.getWritableDatabase();values = new ContentValues();values.put("phone",phone = mEtphone.getText().toString());db.update("information",values,"name=?", new String[]{mEtName.getText().toString()});Toast.makeText(this,"信息已修改",Toast.LENGTH_SHORT).show();db.close();break;case R.id.btn_delete:db =myHelper.getWritableDatabase();db.delete("information",null,null);Toast.makeText(this,"信息已删除",Toast.LENGTH_SHORT).show();mTvShow.setText("");db.close();break;}}
}

4, 核心方法讲解

在上述代码中,一开始创建了一个init()方法,用于初始化界面控件并设置添加,查询,修改,删除按钮的点击监听事件。

 通过SQLiteDatabase类的insert()方法将姓名和电话信息添加到数据库中。

 通过SQLiteDatabase类的query()方法将数据库中的姓名和电话信息查询出来,并显示在界面中。

 通过SQLiteDatabase类的update()方法修改数据库中的姓名和电话信息。

 通过SQLiteDatabase类的delete()方法删除数据库中的姓名和电话信息。

 通过SQLiteDatabase类的execSQL()方法创建表information。

 

5,数据库的创建及初始化

package com.example.directory;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;class MyHelper extends SQLiteOpenHelper {public MyHelper(Context context) {super(context, "incast.db", null, 1);}// 数据库第一次被创建时调用该方法@Overridepublic void onCreate(SQLiteDatabase db) {//初始化数据库的表结构,执行一条建表的SQL语句db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20), phone VARCHAR(20))");}//当数据库的版本号增加时调用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

6,运行程序

运行上述程序:
输入两条联系人信息,点击添加按钮运行,结果如图所示:

点击查询按钮,会发现添加的联系人信息在界面中显示:

 

重新输入一个人的联系电话,点击修改按钮,然后再进行查询,会发现联系人电话已经修改成功:

 

点击删除按钮,会将数据库中所有联系人进行删除:

 

🚩结尾


至此,文件存储的相关知识已讲解完成,该知识所用到的核心技术是利用I/O流来进行文件读写操作,其中,Context类中提供的openFileInput()和OpenFileOutput()方法的用法,一定要掌握。 

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
🌈写给读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈

相关文章:

[Android Studio]Android 数据存储--SQLite数据库存储

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…...

学校节能降耗减排方案——能耗监管平台的建设及效果剖析

摘要&#xff1a;作为崭新的校园能耗管理手段&#xff0c;能耗监测平台以传统管理方式无法企及的优势有力地提升了高校能源管理工作的水平&#xff0e;从而受到了相关管理者的青睐。本文梳理总结了高校能耗监测平台的基本组成和优势特点&#xff0c;同时对能耗平台建设和使用中…...

探索IP地址的应用

无论是互联网行业还是传统行业都会用到网络&#xff0c;作为企业如何维护网络安全&#xff0c;保障网站不被攻击&#xff0c;数据不被泄露等。这个时候我们就会通查询IP归属地&#xff0c;辅助企业解决安全问题。下面介绍一下ip归属地在各行业的具体应用。1.网安行业应用一&…...

点赞破万!阿里面试官总结的2022最新1685页Java面试宝典太全了

程序员入职企业的难度也在持续加大&#xff0c;如何顺利通过面试成为了大家所关心的话题。针对这些人群的需求&#xff0c;小编从阿里找来一份让大家在求职过程中旗开得胜&#xff01;是从什么时候开始准备的&#xff1f;大概的我已经记不清了&#xff0c;可能是 4 月份左右开始…...

项目搭建规范

一. 代码规范 1.1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 # http://editorconfig.org root true [*] # 表示所有文件适用 charset utf-8 # 设置文件字符集为 utf-8 indent_style space # 缩进…...

8.Docker Machine

Docker Machine Docker Machine是Docker官方编排&#xff08;Orchestration&#xff09;项目之一&#xff0c;负责在多种平台上快速安装 Docker 环境。 Docker Machine项目基于Go语言实现&#xff0c;目前在Github上进行维护。 Docker Machine是 Docker 官方提供的一个工具&…...

如何配合使用ESLINT 和 PRETTIER

各自的作用 eslint&#xff1a;静态分析语法错误prettier&#xff1a;代码格式化工具&#xff08;需要在IDE中安装prettier的插件&#xff09; 使用方法&#xff1a; 安装 npm install eslint --save-dev // 创建 .eslintrc.json 文件 npx eslint --init npm install eslint-…...

学英语的优势已来,抓住这个机会

文 / 冰雪&#xff08;微信公众号&#xff1a;王不留&#xff09; ChatGPT大火&#xff0c;国外的商业价值还没找到&#xff0c;咱们这边已经开始变现了。谷雨小姐姐昨天在”一起学英语”微信群发了一张“收割韭菜”的文案截图。 299入社群&#xff0c;服务内容为&#xff1a;免…...

基于微信小程序云开发实现考研题库小程序项目(完整版)

今天手把手的带大家实现一款答题类的题库小程序&#xff0c;如果着急的话&#xff0c;可以直接去看文末源码.下载与项目部署。考研题库小程序云开发实战&#xff0c;完整版提供给大家学习。题库小程序&#xff0c;基于云开发的微信答题小程序&#xff0c;软件架构是微信原生小程…...

AI一点通:使用 ColumnTransformer 转换 Pandas DataFrame 的一个或多个列

在处理表格数据时&#xff0c;常常需要对一个或多个列进行转换以使它们更适合于分析或建模。在许多情况下&#xff0c;可以使用 Pandas 库轻松完成这些转换。然而&#xff0c;在处理大型数据集或构建机器学习管道时&#xff0c;使用 scikit-learn 的 ColumnTransformer 类来将转…...

【C语言】全局变量、局部变量和静态变量的区别

目录一、变量&#xff08;一&#xff09;全局变量&#xff08;二&#xff09;局部变量&#xff08;三&#xff09;静态变量&#xff08;1&#xff09;静态全局变量&#xff08;2&#xff09;静态局部变量二、常量一、变量 1、变量定义 变量的名称可以由字母、数字和下划线字符…...

血氧仪「上潜」,智能穿戴「下沉」

文|智能相对论作者|沈浪缺货、涨价、一“仪”难求......过去短短的几周&#xff0c;血氧仪市场持续走热&#xff0c;受到前所未有的关注&#xff0c;像鱼跃医疗这样的业内巨头更是赚得盆满钵满&#xff0c;但同时也深陷“发国难财”的舆论泥潭&#xff0c;说来也是唏嘘。尽管目…...

CPP2022-计算机类-期末考试

6-1 判断素数 分数 5 全屏浏览题目 切换布局 作者 李国瑞 单位 东北大学秦皇岛分校 设计一个函数&#xff0c;判断输入数据是否为素数&#xff0c;返回bool类型结果。 函数接口定义&#xff1a; bool prime(int num); 说明&#xff1a;num为正整数。 裁判测试程序样例&…...

【蓝桥集训】第二天——差分

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;做题过程中首先应该注意时间复杂度问题&#x1f43e; 文章目录1.改变数组元素2.差分3.差分矩阵1.改变数组元素 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操…...

Spring Boot最核心的27个注解,你了解多少?

https://blog.csdn.net/ManuMAX/article/details/129017443 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架&#xff0c;它不仅可以方便地创建生产级的Spring应用程序&#xff0c;还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成…...

css3弹性盒子

弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。 弹性容器通过设置 display 属性的值为 flex 或 inline-flex将其定义为弹性容器。 弹性容器内包含了一个或多个弹性子元素。 display:flex; 修改排列方式: 0. direction: rtl; //(right-to-left),弹性子元素的…...

数据分析与SAS学习笔记2

SAS在企业使用的情况&#xff1a; SAS是一个很昂贵的商业软件。在企业中使用SAS比较多&#xff0c;在企业界中是比较流行&#xff0c;在学术界使用R比较多。 SAS简介&#xff1a;统计分析系统 处理生物分析数据。 SAS成为统计领域的国际标准软件&#xff0c;服务全球50000多家…...

零信任-Akamai零信任介绍(6)

​Akamai零信任介绍 Akamai是一家专注于分布式网络服务的公司&#xff0c;它提供了一系列的互联网内容和应用加速服务。关于Akamai的零信任&#xff0c;它指的是Akamai的安全架构中不存在任何一个环节是可以被单独的控制或影响的&#xff0c;因此可以提供更高的安全性。通过使…...

表现良好的最长时段[前缀和思想子数组]

前缀和与最长子数组前言一、表现良好的最长时间段二、前缀和思想&子数组1、前缀和&map2、前缀和&单调栈总结参考文献前言 对于子数组/子串问题&#xff0c;紧密连续前缀和/滑动窗口/单调栈&#xff1b;挖掘内在规律&#xff0c;可以简化代码&#xff0c;降低时空复…...

Python 获取当前系统时间

在有的时候&#xff0c;系统不能联网&#xff0c;需要获取系统的当前实现&#xff0c;此时需要python的datetime库。 一、使用方法 1. 导入库&#xff1a;import datetime 2.获取当前日期和时间&#xff1a;now_time datetime.datetime.now() 3.格式化成我们想要的格式&am…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...