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

第五章《Android 数据存储》

第五章 Android 数据存储详解(文件、SharedPreferences、SQLite)

本章目标:

  • 理解 Android 四种数据存储方式

  • 掌握文件存储与 SharedPreferences 的基本操作

  • 掌握 SQLite 数据库的创建与 CRUD 操作

  • 完成两个实战演练:
    ✅ 保存 QQ 账号与密码
    ✅ 模拟“绿豆通讯录”数据库应用


🧭 目录

  • 一、Android 数据存储方式概览

  • 二、文件存储(File Storage)

    • 1. 写入数据到文件

    • 2. 从文件读取数据

    • 3. 实战:保存 QQ 账号与密码(文件版)

  • 三、SharedPreferences 存储

    • 1. 写入与读取数据

    • 2. 实战:保存 QQ 账号与密码(SP版)

  • 四、SQLite 数据库存储

    • 1. 创建数据库与表

    • 2. 数据库的增删改查

    • 3. 数据库事务操作

    • 4. 实战:绿豆通讯录

  • 五、总结与对比


一、Android 数据存储方式概览

存储方式特点适用场景
文件存储读写简单文本轻量数据保存
SharedPreferences存取键值对(XML)保存设置、登录信息
SQLite结构化关系型数据库本地持久化大量数据
网络存储与服务器交互云端同步数据

二、文件存储(File Storage)

1️⃣ 写入数据到文件

public void saveToFile(String account, String password) {try {FileOutputStream fos = openFileOutput("qq_data.txt", MODE_PRIVATE);String content = account + "," + password;fos.write(content.getBytes());fos.close();Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();}
}

📂 保存路径:/data/data/<包名>/files/qq_data.txt


2️⃣ 从文件读取数据

public String readFromFile() {try {FileInputStream fis = openFileInput("qq_data.txt");BufferedReader br = new BufferedReader(new InputStreamReader(fis));return br.readLine();} catch (IOException e) {e.printStackTrace();}return "";
}

3️⃣ 实战:保存 QQ 账号与密码(文件版)

布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:padding="20dp"android:gravity="center"><EditTextandroid:id="@+id/et_account"android:hint="QQ账号"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/et_password"android:hint="密码"android:inputType="textPassword"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btn_save"android:text="保存到文件"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>

Java:MainActivity.java

btn_save.setOnClickListener(v -> {String account = et_account.getText().toString();String password = et_password.getText().toString();saveToFile(account, password);
});

三、SharedPreferences 存储

1️⃣ 写入与读取数据

保存数据:

SharedPreferences sp = getSharedPreferences("qq_prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("account", "123456");
editor.putString("password", "abc123");
editor.apply();  // 异步提交

读取数据:

SharedPreferences sp = getSharedPreferences("qq_prefs", MODE_PRIVATE);
String account = sp.getString("account", "");
String password = sp.getString("password", "");

2️⃣ 实战:保存 QQ 账号与密码(SP版)

btn_save.setOnClickListener(v -> {SharedPreferences.Editor editor =getSharedPreferences("qq_info", MODE_PRIVATE).edit();editor.putString("account", et_account.getText().toString());editor.putString("password", et_password.getText().toString());editor.apply();Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();
});btn_load.setOnClickListener(v -> {SharedPreferences sp = getSharedPreferences("qq_info", MODE_PRIVATE);et_account.setText(sp.getString("account", ""));et_password.setText(sp.getString("password", ""));
});

🗂 数据保存路径:/data/data/<包名>/shared_prefs/qq_info.xml


四、SQLite 数据库存储

1️⃣ 创建数据库与表

public class MyDBHelper extends SQLiteOpenHelper {public MyDBHelper(Context context) {super(context, "contact.db", null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE contact (" +"id INTEGER PRIMARY KEY AUTOINCREMENT, " +"name TEXT, " +"phone TEXT)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldV, int newV) {db.execSQL("DROP TABLE IF EXISTS contact");onCreate(db);}
}

2️⃣ 数据库的增删改查(CRUD)

SQLiteDatabase db = helper.getWritableDatabase();// 插入
ContentValues values = new ContentValues();
values.put("name", "小明");
values.put("phone", "10086");
db.insert("contact", null, values);// 查询
Cursor cursor = db.query("contact", null, null, null, null, null, null);
while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));String phone = cursor.getString(cursor.getColumnIndexOrThrow("phone"));Log.d("Contact", name + ":" + phone);
}// 更新
ContentValues cv = new ContentValues();
cv.put("phone", "10010");
db.update("contact", cv, "name=?", new String[]{"小明"});// 删除
db.delete("contact", "name=?", new String[]{"小明"});

3️⃣ 数据库事务操作

db.beginTransaction();
try {db.execSQL("UPDATE contact SET phone='123456' WHERE name='小红'");db.setTransactionSuccessful();
} finally {db.endTransaction();
}

4️⃣ 实战:绿豆通讯录(SQLite)

布局(简版)
<LinearLayoutandroid:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/et_name"android:hint="联系人姓名"/><EditTextandroid:id="@+id/et_phone"android:hint="电话号码"/><Buttonandroid:id="@+id/btn_add"android:text="添加联系人"/><ListViewandroid:id="@+id/list_contact"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>
Java 逻辑
MyDBHelper helper = new MyDBHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();btn_add.setOnClickListener(v -> {ContentValues values = new ContentValues();values.put("name", et_name.getText().toString());values.put("phone", et_phone.getText().toString());db.insert("contact", null, values);Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();loadContacts();
});private void loadContacts() {List<String> data = new ArrayList<>();Cursor cursor = db.query("contact", null, null, null, null, null, null);while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));String phone = cursor.getString(cursor.getColumnIndexOrThrow("phone"));data.add(name + " : " + phone);}list_contact.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, data));
}

🎯 效果:
可输入姓名和电话,点击“添加联系人”即保存至数据库中,并实时显示在列表中。


五、总结与对比

存储方式数据格式特点示例场景
文件存储文本/二进制简单易用账号密码保存
SharedPreferences键值对(XML)轻量级,自动管理登录信息、设置
SQLite表结构(数据库)强大查询能力通讯录、订单表
网络存储JSON/REST API云端同步聊天记录、用户资料

学习建议:

  • 熟练掌握 SharedPreferencesSQLite 的使用。

  • 实战项目中常组合使用两种存储方式(例如:登录信息用 SP,数据用 DB)。

  • 下章建议学习内容提供器 ContentProvider 与系统共享数据机制。


http://www.dtcms.com/a/609716.html

相关文章:

  • Axios 与 HTTP 状态码:构建健壮前端请求体系的完整指南
  • acos支持mcp,内置mcp server支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。
  • HTTP头信息相关知识了解
  • 做淘客app要网站吗建设工程师交易网站
  • 泛型擦除与桥接方法
  • 深度相机kinect拍摄的.mkv深度视频为什么特别大,mkv文件中含有什么数据,以及数据格式是什么
  • 带数据库网站设计金桥网站建设
  • 国内网站如何做流量网络营销怎么做有特色
  • ios卡顿优化
  • 4G/5G参考信号详解
  • wordpress 子站点宁波人流医院哪家好
  • Unity热更新——AB包和Lua
  • jail瘦虚拟机创立实践@FreeBSD14.3
  • 科技有限公司网站企业信用公示信息网
  • ATT 语法 x86-64 汇编核心知识点总结(附实战案例)
  • 点量云流突破架构壁垒,实现全栈信创自主可控
  • C语言编译成汇编 | 深入理解编译过程与底层实现
  • 一个网站源码值多少钱网站建设初期目标
  • list集合使用
  • DuoPlus更新|新增云手机自定义SIM号码、代理备注等多重功能!
  • 安卓手机/平板/TV版 Rotation强制横屏显示工具!免ROOT可用!再推荐突破手机限制的3款神器
  • Gopeed+cpolar:跨平台下载任务的云端穿透解决方案
  • 手机Basic语言编译器 | 专为手机开发的编程工具与应用场景分析
  • 驾校网站建设滴滴友链
  • Modbus TCP 转 Modbus RTU物联网网关实现光伏产线西门子与罗克韦尔PLC互联
  • Sharding-jdbc 假如全表有20年的数据,按年分表,只需要查最近五年的,该怎么处理
  • 第7章:网络分析与可达性评估
  • 电子电气架构 -- bus off的机理和处理机制
  • leetcode 2536
  • OpenAI与百度同日竞速,文心5.0以原生全模态重新定义AI理解力