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, '[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 应用中有效地存储和管理结构化数据。

相关推荐
恋猫de小郭1 小时前
Flutter Widget IDE 预览新进展,开始推进落地发布
android·前端·flutter
海天一色y2 小时前
Pycharm(十六)面向对象进阶
ide·python·pycharm
百锦再2 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
Ya-Jun6 小时前
常用第三方库:flutter_boost混合开发
android·flutter·ios
_一条咸鱼_7 小时前
深度剖析:Android NestedScrollView 惯性滑动原理大揭秘
android·面试·android jetpack
_一条咸鱼_7 小时前
深度揭秘!Android NestedScrollView 绘制原理全解析
android·面试·android jetpack
_一条咸鱼_7 小时前
揭秘 Android CoordinatorLayout:从源码深度解析其协同工作原理
android·面试·android jetpack
_一条咸鱼_7 小时前
揭秘 Android View 的 TranslationY 位移原理:源码深度剖析
android·面试·android jetpack
_一条咸鱼_7 小时前
揭秘 Android NestedScrollView 滑动原理:源码深度剖析
android·面试·android jetpack
_一条咸鱼_7 小时前
深度揭秘:Android NestedScrollView 拖动原理全解析
android·面试·android jetpack