Android中的三种数据存储方式

目录

1.文件存储

1)内部存储

1--MODE_PRIVATE: 

2--MODE_APPEND:

3--MODE_WORLD_READABLE:

4--MODE_WORLD_WRITEABLE:

5--简单使用

3)外部存储

4)内部读取

4)外部读取

2.SharePreferences存储

1)基本概念

2)存储位置

3)支持的数据类型

4)使用步骤

1--获取 SharedPreferences 对象

2--编辑数据

3--读取数据

5)注意事项

3.SQLite数据存储

1)创建SQLite数据库

2)SQLite数据库的基本操作

1--新增操作

2--删除数据

3--修改数据

4--查询数据

3)SQLite数据库中的事务


1.文件存储

  • 文件存储是指直接将数据以文件的形式保存到设备的内部或外部存储中。
  • 内部存储通常是私有的,其他应用无法访问你的应用创建的文件,除非你明确地共享它们。
  • 外部存储可以是公共的(比如SD卡),用户和其他应用都可以访问这些文件。
  • 使用openFileOutput()openFileInput()等API来读写文件。
  • 适用于存储大量文本数据或者二进制数据,如图片、视频等。

1)内部存储

1--MODE_PRIVATE: 

        该文件只能被但当前程序读写

2--MODE_APPEND:

        该文件的内容可以追加

3--MODE_WORLD_READABLE:

        该文件的内容可以被其他程序读

4--MODE_WORLD_WRITEABLE:

        该文件的内容可以被其他程序写

//写入流

FileOutputStream fos = openFileOutput(String name ,  int  mode)

//读取流

FileInputStream fis = openFileInput(String name);

5--简单使用

String 文件名字 = "名字" //文件名

String  数据名 = "这里是数据的内容" //需要保存的数据

        FileOutputStream fos = null;

try{

        fos = openFileOutput(文件名字,写入模式)

        fos.write(数据名.getBytes());//将数据写入文件

}catch(Exception e){

                                e.printStackTrace();//打印错误信息

                        }

}finally{

       

                try{

                        if(fos!=null){

                                fos.close();  //把输入流关闭

                        }

                catch(Exception e){

                                e.printStackTrace();//打印错误信息

                        }

                }

}

3)外部存储

  //外部写入public void outRead(){//获取SD卡状态String SDStatus = Environment.getExternalStorageState();//判断卡片是否可用if (!SDStatus.equals(Environment.MEDIA_MOUNTED)) {return;}//获取SD卡路径File externalStorageDirectory = Environment.getExternalStorageDirectory();File file = new File(externalStorageDirectory,"data.txt");//创建写入流FileOutputStream fos = null;try {//写入流fos = new FileOutputStream(file);//写入内容fos.write("写入数据".getBytes());} catch (Exception e) {e.printStackTrace();}finally {try {fos.close();} catch (Exception e) {e.printStackTrace();}}}

4)内部读取

openFileInput()获取FileInputStream读取流fis===>读取流fis创建字节缓冲区===>fis.read()==>读取之后转化为字符串写入

   //内部读取public void inRead(){String contextInfo = "";//读取流FileInputStream fis = null;try {//读取文件流fis = openFileInput("data.txt");byte[] bytes = new byte[fis.available()];//文件读取到bytes数组中fis.read(bytes);//将读取到的字节数组转换为字符串contextInfo = new String(bytes);} catch (Exception e) {e.printStackTrace();}finally {try {fis.close();} catch (Exception e) {e.printStackTrace();}}}

4)外部读取

//外部读取public void outReadTwo(){//SD状态  === 》 判断sd卡是否存在  ==》存在==>读取外部文件String SDStatus = Environment.getExternalStorageState();if (!SDStatus.equals(Environment.MEDIA_MOUNTED)){return;}//获取SD卡路径File externalStorageDirectory = Environment.getExternalStorageDirectory();File file = new File(externalStorageDirectory,"data.txt");//读取流FileInputStream fis = null;try {fis = new FileInputStream(file);byte[] bytes = new byte[fis.available()];fis.read(bytes);String contextInfo = new String(bytes);} catch (Exception e) {e.printStackTrace();}finally {try {fis.close();return;}catch (Exception e) {e.printStackTrace();}}}

2.SharePreferences存储

  • SharedPreferences 是一种轻量级的数据存储方式,主要用于保存应用程序的配置信息,例如用户的设置偏好。
  • 数据是以键值对(key-value)形式存储,并且是以XML文件格式存放在设备上。
  • 使用getSharedPreferences()获取SharedPreferences对象,然后通过edit()方法编辑数据,最后调用apply()commit()保存更改。
  • 适合于存储少量的原始类型数据,如布尔值、整数、浮点数、字符串等。
  • 不适合存储复杂的数据结构或大量数据

1)基本概念

  • SharedPreferences 对象:代表一个文件,其中包含了一些键值对。
  • Editor:通过 SharedPreferences 的 edit() 方法获取到的对象,用来修改数据。
  • 键值对:数据的基本单位,由一个唯一的键和对应的值组成。

2)存储位置

  • SharedPreferences 文件默认存储在应用私有目录下的 /data/data/<package_name>/shared_prefs/ 目录中。
  • 用户无法直接访问这个目录,除非设备已 root 并且用户具有足够的权限。

3)支持的数据类型

  • boolean
  • float
  • int
  • long
  • String
  • Set<String>

4)使用步骤

1--获取 SharedPreferences 对象

// 获取名为 "MyPreferences" 的 SharedPreferences 对象
SharedPreferences sharedPreferences = getSharedPreferences("MyPreferences", MODE_PRIVATE);

2--编辑数据

// 获取 Editor 对象
SharedPreferences.Editor editor = sharedPreferences.edit();// 添加键值对
editor.putString("key_string", "Hello, World!");
editor.putInt("key_int", 42);
editor.putBoolean("key_boolean", true);// 提交更改
editor.apply();  // 异步操作,不阻塞主线程
// 或者使用 editor.commit(); // 同步操作,会阻塞主线程直到写入完成
  • 通过 SharedPreferences.Editor 接口来编辑数据。
  • putXXX() 方法将键值对添加到编辑器中。
  • apply() 或 commit() 将更改提交到 SharedPreferences

3--读取数据

// 读取数据
String value = sharedPreferences.getString("key_string", "Default Value");
int intValue = sharedPreferences.getInt("key_int", 0);
boolean boolValue = sharedPreferences.getBoolean("key_boolean", false);
  • 通过 SharedPreferences 的 getXXX() 方法读取数据。
  • 如果没有找到指定的键,则可以提供一个默认值。

5)注意事项

  • 线程安全SharedPreferences 不是线程安全的,如果在多线程环境中使用,需要自行处理同步问题。
  • 性能:频繁地调用 apply() 或 commit() 可能会导致性能问题,尽量减少不必要的写入操作。
  • 安全性:虽然 SharedPreferences 是私有的,但并不适合存储敏感信息,如密码等,因为这些信息可能被反编译工具读取

SharedPreferences 非常适合于存储少量、简单的数据,比如用户的设置选项。对于更复杂的数据结构或大量的数据,建议使用 SQLite 数据库或其他形式的持久化存储。

3.SQLite数据存储

  • SQLite 是一个关系型数据库管理系统,它被嵌入到Android系统中,提供了强大的数据存储能力。
  • 它支持SQL语言,允许开发者执行复杂的查询操作。
  • 使用SQLiteOpenHelper类可以帮助管理数据库的创建和版本更新。
  • SQLiteDatabase类用于进行数据库的操作,包括增删改查。
  • 适合存储结构化的数据,以及需要进行复杂查询的数据集。
  • 可以处理大量数据,但相比其他两种方式,它的使用稍微复杂一些。

1)创建SQLite数据库

        为了方便地管理SQLite数据库,通常会继承SQLiteOpenHelper类,并重写其中的onCreate()onUpgrade()方法。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "example.db";private static final int DATABASE_VERSION = 1;// 表名public static final String TABLE_NAME = "users";// 列名public static final String COLUMN_ID = "_id";public static final String COLUMN_NAME = "name";public static final String COLUMN_AGE = "age";private static final String CREATE_TABLE ="CREATE TABLE " + TABLE_NAME + "(" +COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +COLUMN_NAME + " TEXT, " +COLUMN_AGE + " INTEGER" + ")";public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_TABLE);  // 创建表}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 删除旧表并重新创建(简单处理)db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);onCreate(db);}
}

2)SQLite数据库的基本操作

1--新增操作

public long insertUser(String name, int age) {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();ContentValues values = new ContentValues();values.put(COLUMN_NAME, name);values.put(COLUMN_AGE, age);return db.insert(TABLE_NAME, null, values);
}

2--删除数据

public int deleteUserById(long id) {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();return db.delete(TABLE_NAME, COLUMN_ID + "=?", new String[]{String.valueOf(id)});
}

3--修改数据

public int updateUser(long id, String newName, int newAge) {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();ContentValues values = new ContentValues();values.put(COLUMN_NAME, newName);values.put(COLUMN_AGE, newAge);return db.update(TABLE_NAME, values, COLUMN_ID + "=?", new String[]{String.valueOf(id)});
}

4--查询数据

public Cursor getAllUsers() {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();return db.query(TABLE_NAME, null, null, null, null, null, null);
}public Cursor getUserById(long id) {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();return db.query(TABLE_NAME, null, COLUMN_ID + "=?", new String[]{String.valueOf(id)}, null, null, null);
}

3)SQLite数据库中的事务

        事务是一系列数据库操作,它们被视为单个工作单元,要么全部执行成功,要么都不执行。这有助于确保数据的一致性和完整性。

public boolean performTransaction() {SQLiteDatabase db = new DatabaseHelper().getWritableDatabase();try {db.beginTransaction();  // 开始事务// 执行一系列数据库操作ContentValues values = new ContentValues();values.put(COLUMN_NAME, "John");values.put(COLUMN_AGE, 30);db.insert(TABLE_NAME, null, values);values.clear();values.put(COLUMN_NAME, "Jane");values.put(COLUMN_AGE, 25);db.insert(TABLE_NAME, null, values);db.setTransactionSuccessful();  // 标记事务为成功return true;} finally {db.endTransaction();  // 结束事务}
}

        如果在事务过程中发生错误,setTransactionSuccessful()不会被调用,因此事务将会回滚,所有在该事务内的更改都将被撤销。这样可以防止数据不一致的情况发生。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 - 行为模式

行为模式 观察者模式&#xff0c;策略模式&#xff0c;命令模式&#xff0c;中介者模式&#xff0c;备忘录模式&#xff0c;模板方法模式&#xff0c;迭代器模式&#xff0c;状态模式&#xff0c;责任链模式&#xff0c;解释器模式&#xff0c;访问者模式 保存/封装 行为/请求…

MySQL表连接查询算法

前言 MySQL属于关系型数据库&#xff0c;我们建的表大多也都存在业务上的关联关系&#xff0c;同时我们又不可能将所有的数据都冗余一份&#xff0c;这不符合数据库的设计范式。因此&#xff0c;当我们需要把多张表的数据融合在一起的时候&#xff0c;就需要使用到「多表连接查…

CSS伪元素详解

CSS伪元素详解 一、引言 在CSS中&#xff0c;伪元素是一个非常强大的工具&#xff0c;它允许我们为元素的特定部分添加样式&#xff0c;而无需修改HTML结构。这不仅提高了样式的灵活性&#xff0c;还有助于保持代码的整洁和可维护性。本文将深入探讨CSS伪元素的使用方法和一些…

详解tar.gz, tar.xz, tar, gz后缀文件的区别

详解tar.gz, tar.xz,tar, gz后缀文件的区别 tar.gz、tar.xz、tar 和 gz 是常见的文件压缩与归档格式&#xff0c;它们的区别主要在于文件的归档和压缩方式。 1. tar 文件 全称&#xff1a;Tape Archive扩展名&#xff1a;.tar说明&#xff1a;tar 文件本身并没有压缩&#x…

SQL分类中的DDL

DDL&#xff08;Data Definition Language):数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;。 一、DDL语句操作数据库 1、查询所有数据库&#xff1a;show databases&#xff1b;&#xff08;一般用大写&#xff…

C语言动态内存开辟

文章目录 malloc函数free函数calloc函数realloc函数二维数组的动态内存开辟 malloc函数 malloc函数包含再#include<stdlib.h>头文件中 void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间&#xff0c;并返回指向这块空间的指针。 如果开辟成功&#xff…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了多种人脸检测方法&#xff0c;以下是对OpenCV人脸检测的详细介绍&#xff1a; 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

【Docker系列】Docker查看镜像架构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

模态与非模态的对话框

本文学习自&#xff1a; 《Qt Creato快速入门》 #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }1. #include "widget.h" #include "ui_w…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

小白也能学会的预测新模型!ReliefF特征选择+XGBoost回归!

小白也能学会的预测新模型&#xff01;ReliefF特征选择XGBoost回归&#xff01; 目录 小白也能学会的预测新模型&#xff01;ReliefF特征选择XGBoost回归&#xff01;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现ReliefF-XGBoost多变量回归预测 1.excel数据…

linux应用

检查Python程序未运行则重新运行 entity_program定时杀掉进程重新运行 match_program定时检查是否运行&#xff0c;未运行则启动 (注意echo时间时&#xff0c;date和中间要有空格) #!/bin/bash# 检测的Python程序名称 entity_program"entity.py" match_program"…

算法收敛的一些证明方法与案例

证明一个算法收敛通常涉及多个角度&#xff0c;以下是一些常用的方法和示例&#xff1a; 一、方法 1. 数学归纳法 通过数学归纳法证明算法在每一步的输出结果都在收敛范围内。 示例&#xff1a;考虑一个递归算法&#xff0c;假设我们要证明它在每一步中输出的值逐渐接近目标…

有问必答!zabbix“专家坐诊”第259期问答

问题一 Q&#xff1a;现在监控项4万多&#xff0c;调整到多少比较合理 zabbix7.03&#xff1f; A&#xff1a;慢慢往上调&#xff0c;没有标准。 问题二 Q&#xff1a;想问下大家&#xff0c;zabbix的监控项怎么不能自动清除&#xff0c;比如说这次监控是A监控项&#xff0c;下…

[LeetCode] 315. 计算右侧小于当前元素的个数

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目主要思路&a…

如何通过构建对应的api服务器使Vue连接到数据库

一、安装数据库驱动 在后端安装 MySQL 数据库驱动&#xff0c;比如在 Node.js 环境中可以使用 mysql2 包来连接 MySQL 数据库。在项目目录下运行以下命令安装&#xff1a; npm install mysql2或者使用 yarn&#xff1a; yarn add mysql2二、创建数据库连接模块 创建一个专门…

Light灯光组件+组件的相关操作+游戏资源的加载

Light灯光组件 Type: Directional:平行光&#xff0c;模仿的是太阳光 Spot:聚光灯 Area:区域光 Color&#xff1a; 颜色值 Mode: RealTime:实时 Mix:混合 Baked:烘焙 Intersity: 光照强度 Indirect Multiplier:光照强度乘数 Shadow Type:影子设置&#xff1a;…

Maven和Gradle的对比

Maven和Gradle都是Java项目构建工具&#xff0c;它们在帮助开发者管理项目依赖、编译、打包等方面发挥着重要作用。 Maven和Gradle的区别 1、语法与配置文件 Maven使用XML作为配置文件&#xff08;如pom.xml&#xff09;的语言&#xff0c;XML结构清晰但相对冗长。Gradle则使…

Java通过RAG构建专属知识问答机器人_超详细

RAG&#xff1a;融合检索与生成的文本精准生成技术 检索增强生成&#xff08;RAG&#xff09;是一种技术&#xff0c;它通过结合检索模型和生成模型来提高文本生成的准确性。具体来说&#xff0c;RAG首先利用检索模型从私有或专有的数据源中搜索相关信息&#xff0c;然后将这些…

CentOS上安装SSL证书教程

在 CentOS 上&#xff0c;apt-get 是不可用的&#xff0c;因为 CentOS 使用的是 yum 或 dnf 包管理器。你可以通过 yum 或 dnf 安装 certbot 和 python3-certbot-nginx。以下是详细的步骤&#xff1a; 1. 启用 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff0…