Android Studio开发 SharedPreferences 详解

文章目录

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_READABLEMODE_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);

最佳实践

  1. 不要存储大量数据:SharedPreferences 不适合存储大量数据,考虑 SQLite 或其他方式
  2. 避免存储复杂对象:只能存储基本数据类型
  3. 合理使用 apply():大多数情况下使用 apply() 而非 commit()
  4. 注意性能:频繁读写可能影响性能
  5. 合理命名文件:对于不同模块使用不同的 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, 'zhangsan@example.com');

查询数据

基本查询:

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 = 'new_email@example.com' 
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 应用中有效地存储和管理结构化数据。

相关推荐
阿巴斯甜15 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker16 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952717 小时前
Andorid Google 登录接入文档
android
黄林晴18 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android