安卓数据存储宝典:SharedPreferences、SQLite 数据库、文件系统
在安卓应用开发中,数据存储是至关重要的环节,它决定了应用如何保存用户数据、设置和状态。本教程将深入探讨三种常用的数据存储方式:SharedPreferences、SQLite 数据库和文件系统,并提供丰富实例和代码,助力你掌握数据存储技巧。
1. SharedPreferences:轻松存储简单数据
SharedPreferences 是一个轻量级的键值对存储方案,适合存储简单的配置数据、用户偏好设置等。
使用步骤:
- 获取 SharedPreferences 对象:
SharedPreferences sharedPreferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE);
getSharedPreferences()
方法用于获取 SharedPreferences 对象,第一个参数是文件名,第二个参数是访问模式,MODE_PRIVATE
代表私有访问。
- 操作数据:
- 写入数据:
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username", "John Doe");
editor.putInt("age", 30);
editor.putBoolean("is_logged_in", true);
editor.apply(); // 或 commit()
-
edit()
方法获取编辑器,用于写入数据。 -
putString()
,putInt()
,putBoolean()
等方法用于写入不同类型的数据。 -
apply()
和commit()
方法用于提交数据,apply()
非阻塞操作,commit()
是阻塞操作。 -
读取数据:
String username = sharedPreferences.getString("username", "");
int age = sharedPreferences.getInt("age", 0);
boolean isLoggedIn = sharedPreferences.getBoolean("is_logged_in", false);
getString()
,getInt()
,getBoolean()
等方法用于读取对应类型的数据。- 第二个参数是默认值,当对应键不存在时返回该值。
实例:
// 写入用户设置
SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("theme", "dark");
editor.putBoolean("notifications_enabled", true);
editor.apply();
// 读取用户设置
String theme = prefs.getString("theme", "light");
boolean notificationsEnabled = prefs.getBoolean("notifications_enabled", false);
优点:
- 使用简单,易于操作
- 适合存储少量数据
- 跨进程共享
缺点:
- 只能存储基本数据类型
- 数据容量有限
- 不适合存储复杂数据结构
2. SQLite 数据库:高效存储结构化数据
SQLite 数据库是嵌入式数据库,适用于存储结构化数据,如用户信息、交易记录等。
使用步骤:
- 创建数据库和表:
// 创建数据库
SQLiteDatabase db = this.openOrCreateDatabase("my_database", MODE_PRIVATE, null);
// 创建表
db.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
openOrCreateDatabase()
方法用于创建或打开数据库。execSQL()
方法用于执行 SQL 语句,创建表。
- 操作数据:
- 插入数据:
ContentValues values = new ContentValues();
values.put("name", "Jane Doe");
values.put("age", 25);
db.insert("users", null, values);
-
ContentValues
对象用于存储要插入的数据。 -
insert()
方法将数据插入指定的表。 -
查询数据:
Cursor cursor = db.query("users", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
}
cursor.close();
-
query()
方法用于查询数据。 -
Cursor
对象用于遍历查询结果。 -
更新数据:
ContentValues values = new ContentValues();
values.put("age", 28);
db.update("users", values, "name = ?", new String[] {"Jane Doe"});
-
update()
方法用于更新数据。 -
删除数据:
db.delete("users", "id = ?", new String[] {"1"});
delete()
方法用于删除数据。
实例:
// 插入用户数据
SQLiteDatabase db = openOrCreateDatabase("my_database", MODE_PRIVATE, null);
ContentValues values = new ContentValues();
values.put("name", "John Doe");
values.put("age", 30);
db.insert("users", null, values);
// 查询用户数据
Cursor cursor = db.query("users", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d("Database", "Name: " + name + ", Age: " + age);
}
cursor.close();
优点:
- 结构化数据存储
- 支持复杂查询
- 高效的检索和更新操作
缺点:
- 学习成本较高
- 代码复杂度高
- 无法跨进程共享
3. 文件系统:灵活存储各种数据
文件系统是安卓提供的一种通用存储机制,可以存储各种类型的数据,包括文本、图片、音频等。
使用步骤:
- 获取文件路径:
// 获取内部存储路径
File internalFile = getFilesDir();
// 获取外部存储路径
File externalFile = getExternalFilesDir(null);
getFilesDir()
用于获取内部存储路径。getExternalFilesDir()
用于获取外部存储路径,第一个参数用于指定文件类型,null
代表根目录。
- 创建文件:
File file = new File(internalFile, "my_file.txt");
FileOutputStream fos = new FileOutputStream(file);
File
对象用于表示文件。FileOutputStream
用于写入文件。
- 操作数据:
- 写入数据:
String data = "This is some data.";
byte[] buffer = data.getBytes();
fos.write(buffer);
fos.close();
-
write()
方法用于写入数据。 -
读取数据:
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
String data = new String(buffer);
fis.close();
FileInputStream
用于读取文件。read()
方法用于读取数据。
实例:
// 写入文本文件
File file = new File(getFilesDir(), "my_file.txt");
FileOutputStream fos = new FileOutputStream(file);
String text = "Hello, world!";
byte[] buffer = text.getBytes();
fos.write(buffer);
fos.close();
// 读取文本文件
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
String text = new String(buffer);
fis.close();
优点:
- 灵活多样的存储方式
- 适用于各种类型的数据
- 支持跨进程共享
缺点:
- 数据管理复杂
- 文件操作相对繁琐
- 数据安全问题
小结
选择合适的存储方式:
存储方式 | 优点 | 缺点 | 适合场景 |
---|---|---|---|
SharedPreferences | 简单易用,适合存储少量数据 | 只能存储基本数据类型,数据容量有限 | 存储应用设置、用户偏好 |
SQLite 数据库 | 结构化数据存储,支持复杂查询 | 学习成本较高,代码复杂度高 | 存储用户信息、交易记录等结构化数据 |
文件系统 | 灵活多样的存储方式,适用于各种类型的数据 | 数据管理复杂,文件操作相对繁琐 | 存储图片、音频、视频等非结构化数据 |
希望本教程能帮助你深入了解安卓数据存储方式,并选择最合适的方案来满足你的应用需求。