文章目录
- [SharedPreferences 详解](#SharedPreferences 详解)
-
- 基本概念
- [获取 SharedPreferences 实例](#获取 SharedPreferences 实例)
-
- [1. Context.getSharedPreferences()](#1. Context.getSharedPreferences())
- [2. Activity.getPreferences()](#2. Activity.getPreferences())
- [3. PreferenceManager.getDefaultSharedPreferences()](#3. PreferenceManager.getDefaultSharedPreferences())
- 存储模式
- 写入数据
-
- [apply() vs commit()](#apply() vs commit())
- 读取数据
- 监听数据变化
- 最佳实践
- 高级用法
-
- 存储字符串集合 (API 11+)
- [使用 EncryptedSharedPreferences (API 23+)](#使用 EncryptedSharedPreferences (API 23+))
- [SQLite 基本语法详解](#SQLite 基本语法详解)
-
- [1. 数据类型](#1. 数据类型)
- [2. 数据库操作](#2. 数据库操作)
- [3. 表操作](#3. 表操作)
- [4. 数据操作](#4. 数据操作)
- [5. 高级查询](#5. 高级查询)
- [6. 约束](#6. 约束)
- [7. 索引](#7. 索引)
- [8. 视图](#8. 视图)
- [9. 事务](#9. 事务)
- [10. Android 中的 SQLite 使用](#10. Android 中的 SQLite 使用)
- 总结

SharedPreferences 详解
SharedPreferences 是 Android 提供的一种轻量级数据存储方式,用于存储简单的键值对数据。它适合保存应用的配置信息、用户偏好设置等小量数据。
基本概念
SharedPreferences 以 XML 文件的形式存储在设备的 /data/data/<package_name>/shared_prefs/
目录下,具有以下特点:
- 只能存储基本数据类型:boolean, float, int, long, string 和 string set
- 数据以键值对形式存储
- 线程安全
- 不支持多进程共享(除非使用 MODE_MULTI_PROCESS,但已废弃)
获取 SharedPreferences 实例
有三种方式获取 SharedPreferences 对象:
1. Context.getSharedPreferences()
java
// 指定文件名和模式
SharedPreferences sharedPref = context.getSharedPreferences(
"my_preferences", Context.MODE_PRIVATE);
2. Activity.getPreferences()
java
// 使用 Activity 类名作为文件名,只适用于当前 Activity
SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
3. PreferenceManager.getDefaultSharedPreferences()
java
// 获取默认的 SharedPreferences 文件 (包名_preferences.xml)
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
存储模式
MODE_PRIVATE
:默认模式,只有当前应用可以访问MODE_WORLD_READABLE
和MODE_WORLD_WRITEABLE
:已在 API 17 废弃MODE_MULTI_PROCESS
:已在 API 23 废弃
写入数据
要写入数据,需要使用 SharedPreferences.Editor:
java
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("key_string", "Hello World");
editor.putInt("key_int", 123);
editor.putBoolean("key_boolean", true);
editor.apply(); // 异步提交
// 或 editor.commit(); // 同步提交,返回boolean表示成功与否
apply() vs commit()
apply()
:异步写入磁盘,无返回值,更高效commit()
:同步写入磁盘,返回 boolean 表示成功与否,会阻塞 UI 线程
读取数据
java
String stringValue = sharedPref.getString("key_string", "default_value");
int intValue = sharedPref.getInt("key_int", 0);
boolean booleanValue = sharedPref.getBoolean("key_boolean", false);
监听数据变化
可以注册监听器来监听数据变化:
java
SharedPreferences.OnSharedPreferenceChangeListener listener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// 处理特定key的变化
}
};
sharedPref.registerOnSharedPreferenceChangeListener(listener);
// 记得在适当时候取消注册
sharedPref.unregisterOnSharedPreferenceChangeListener(listener);
最佳实践
- 不要存储大量数据:SharedPreferences 不适合存储大量数据,考虑 SQLite 或其他方式
- 避免存储复杂对象:只能存储基本数据类型
- 合理使用 apply():大多数情况下使用 apply() 而非 commit()
- 注意性能:频繁读写可能影响性能
- 合理命名文件:对于不同模块使用不同的 SharedPreferences 文件
高级用法
存储字符串集合 (API 11+)
java
// 写入
Set<String> stringSet = new HashSet<>();
stringSet.add("value1");
stringSet.add("value2");
editor.putStringSet("key_set", stringSet);
// 读取
Set<String> retrievedSet = sharedPref.getStringSet("key_set", new HashSet<String>());
使用 EncryptedSharedPreferences (API 23+)
对于敏感数据,可以使用加密的 SharedPreferences:
java
String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
"secret_shared_prefs",
masterKeyAlias,
context,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
SharedPreferences 是 Android 开发中最常用的数据存储方式之一,合理使用可以方便地管理应用的配置和用户偏好设置。
SQLite 基本语法详解
SQLite 是一个轻量级的关系型数据库,被广泛用于移动应用和嵌入式系统中。以下是 SQLite 的基本语法详解。
1. 数据类型
SQLite 支持以下基本数据类型:
NULL
- 空值INTEGER
- 整数REAL
- 浮点数TEXT
- 文本字符串BLOB
- 二进制数据
2. 数据库操作
创建数据库
sql
-- 创建或打开数据库(通常在代码中完成)
-- Android中通过SQLiteOpenHelper类实现
删除数据库
sql
-- 删除数据库文件(通常在代码中完成)
-- Android中使用context.deleteDatabase("database_name.db")
3. 表操作
创建表
sql
CREATE TABLE table_name (
column1 datatype PRIMARY KEY,
column2 datatype NOT NULL,
column3 datatype DEFAULT default_value,
column4 datatype CHECK(condition),
...
);
示例:
sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
删除表
sql
DROP TABLE table_name;
修改表
sql
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name datatype;
-- 重命名表
ALTER TABLE old_table_name RENAME TO new_table_name;
4. 数据操作
插入数据
sql
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
示例:
sql
INSERT INTO users (name, age, email)
VALUES ('张三', 25, '[email protected]');
查询数据
基本查询:
sql
SELECT column1, column2, ... FROM table_name;
SELECT * FROM table_name; -- 查询所有列
条件查询:
sql
SELECT * FROM table_name WHERE condition;
示例:
sql
SELECT * FROM users WHERE age > 20;
SELECT name, email FROM users WHERE age BETWEEN 20 AND 30;
更新数据
sql
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
示例:
sql
UPDATE users
SET age = 26, email = '[email protected]'
WHERE id = 1;
删除数据
sql
DELETE FROM table_name WHERE condition;
示例:
sql
DELETE FROM users WHERE id = 5;
5. 高级查询
排序
sql
SELECT * FROM table_name ORDER BY column1 ASC, column2 DESC;
限制结果
sql
SELECT * FROM table_name LIMIT number OFFSET start;
-- 或简写为
SELECT * FROM table_name LIMIT start, number;
分组
sql
SELECT column1, COUNT(*)
FROM table_name
GROUP BY column1;
连接查询
sql
-- 内连接
SELECT a.column1, b.column2
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1_id;
-- 左外连接
SELECT a.column1, b.column2
FROM table1 a
LEFT JOIN table2 b ON a.id = b.table1_id;
6. 约束
SQLite 支持以下约束:
PRIMARY KEY
- 主键UNIQUE
- 唯一值NOT NULL
- 非空CHECK
- 检查条件DEFAULT
- 默认值FOREIGN KEY
- 外键
7. 索引
创建索引
sql
CREATE INDEX index_name ON table_name (column1, column2, ...);
删除索引
sql
DROP INDEX index_name;
8. 视图
创建视图
sql
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
删除视图
sql
DROP VIEW view_name;
9. 事务
sql
BEGIN TRANSACTION;
-- SQL语句
COMMIT;
-- 或 ROLLBACK; 回滚
10. Android 中的 SQLite 使用
在 Android 中,通常通过 SQLiteOpenHelper
类来操作 SQLite 数据库:
java
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "my_database.db";
private static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE users (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT NOT NULL," +
"age INTEGER);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}
使用示例:
java
DatabaseHelper dbHelper = new DatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "李四");
values.put("age", 30);
long newRowId = db.insert("users", null, values);
// 查询数据
Cursor cursor = db.query("users", null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
// 处理数据
}
cursor.close();
db.close();
总结
SQLite 提供了完整的 SQL 功能,但比大型数据库系统更轻量。掌握这些基本语法后,您可以在 Android 应用中有效地存储和管理结构化数据。