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

Android Studio开发 SharedPreferences 详解

文章目录

  • SharedPreferences 详解
    • 基本概念
    • 获取 SharedPreferences 实例
      • 1. Context.getSharedPreferences()
      • 2. Activity.getPreferences()
      • 3. PreferenceManager.getDefaultSharedPreferences()
    • 存储模式
    • 写入数据
      • apply() vs commit()
    • 读取数据
    • 监听数据变化
    • 最佳实践
    • 高级用法
      • 存储字符串集合 (API 11+)
      • 使用 EncryptedSharedPreferences (API 23+)
  • SQLite 基本语法详解
    • 1. 数据类型
    • 2. 数据库操作
      • 创建数据库
      • 删除数据库
    • 3. 表操作
      • 创建表
      • 删除表
      • 修改表
    • 4. 数据操作
      • 插入数据
      • 查询数据
      • 更新数据
      • 删除数据
    • 5. 高级查询
      • 排序
      • 限制结果
      • 分组
      • 连接查询
    • 6. 约束
    • 7. 索引
      • 创建索引
      • 删除索引
    • 8. 视图
      • 创建视图
      • 删除视图
    • 9. 事务
    • 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()

// 指定文件名和模式
SharedPreferences sharedPref = context.getSharedPreferences("my_preferences", Context.MODE_PRIVATE);

2. Activity.getPreferences()

// 使用 Activity 类名作为文件名,只适用于当前 Activity
SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);

3. PreferenceManager.getDefaultSharedPreferences()

// 获取默认的 SharedPreferences 文件 (包名_preferences.xml)
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);

存储模式

  • MODE_PRIVATE:默认模式,只有当前应用可以访问
  • MODE_WORLD_READABLEMODE_WORLD_WRITEABLE:已在 API 17 废弃
  • MODE_MULTI_PROCESS:已在 API 23 废弃

写入数据

要写入数据,需要使用 SharedPreferences.Editor:

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 线程

读取数据

String stringValue = sharedPref.getString("key_string", "default_value");
int intValue = sharedPref.getInt("key_int", 0);
boolean booleanValue = sharedPref.getBoolean("key_boolean", false);

监听数据变化

可以注册监听器来监听数据变化:

SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {@Overridepublic 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+)

// 写入
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:

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. 数据库操作

创建数据库

-- 创建或打开数据库(通常在代码中完成)
-- Android中通过SQLiteOpenHelper类实现

删除数据库

-- 删除数据库文件(通常在代码中完成)
-- Android中使用context.deleteDatabase("database_name.db")

3. 表操作

创建表

CREATE TABLE table_name (column1 datatype PRIMARY KEY,column2 datatype NOT NULL,column3 datatype DEFAULT default_value,column4 datatype CHECK(condition),...
);

示例:

CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,email TEXT UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

删除表

DROP TABLE table_name;

修改表

-- 添加列
ALTER TABLE table_name ADD COLUMN column_name datatype;-- 重命名表
ALTER TABLE old_table_name RENAME TO new_table_name;

4. 数据操作

插入数据

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...);

示例:

INSERT INTO users (name, age, email) 
VALUES ('张三', 25, 'zhangsan@example.com');

查询数据

基本查询:

SELECT column1, column2, ... FROM table_name;
SELECT * FROM table_name;  -- 查询所有列

条件查询:

SELECT * FROM table_name WHERE condition;

示例:

SELECT * FROM users WHERE age > 20;
SELECT name, email FROM users WHERE age BETWEEN 20 AND 30;

更新数据

UPDATE table_name 
SET column1 = value1, column2 = value2, ...
WHERE condition;

示例:

UPDATE users 
SET age = 26, email = 'new_email@example.com' 
WHERE id = 1;

删除数据

DELETE FROM table_name WHERE condition;

示例:

DELETE FROM users WHERE id = 5;

5. 高级查询

排序

SELECT * FROM table_name ORDER BY column1 ASC, column2 DESC;

限制结果

SELECT * FROM table_name LIMIT number OFFSET start;
-- 或简写为
SELECT * FROM table_name LIMIT start, number;

分组

SELECT column1, COUNT(*) 
FROM table_name 
GROUP BY column1;

连接查询

-- 内连接
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. 索引

创建索引

CREATE INDEX index_name ON table_name (column1, column2, ...);

删除索引

DROP INDEX index_name;

8. 视图

创建视图

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

删除视图

DROP VIEW view_name;

9. 事务

BEGIN TRANSACTION;
-- SQL语句
COMMIT;
-- 或 ROLLBACK; 回滚

10. Android 中的 SQLite 使用

在 Android 中,通常通过 SQLiteOpenHelper 类来操作 SQLite 数据库:

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);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE users (" +"id INTEGER PRIMARY KEY AUTOINCREMENT," +"name TEXT NOT NULL," +"age INTEGER);");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS users");onCreate(db);}
}

使用示例:

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

http://www.xdnf.cn/news/79183.html

相关文章:

  • 联易融受邀参加上海审计局金融审计处专题交流座谈
  • Linux进程6-alarm闹钟定时终止、raise发送信号、abort终止、pause挂起进程验证
  • Jenkins的地位和作用
  • Nginx:支持 HTTPS
  • SQL Tuning Advisor
  • [OpenGL] Lambertian材质漫反射BRDF方程的解释与推导
  • Spark-Streaming简介和核心编程
  • 发布一个npm包,更新包,删除包
  • Python基础知识语法归纳总结(数据类型-2)
  • 开源QML控件:进度条滑动控件(含源码下载链接)
  • 【Ansible】批量管理 Windows自动化运维
  • GTS-400 系列运动控制器板(六)----修改编码器计数方向
  • UML 状态图:以共享汽车系统状态图为例
  • 全面介绍AVFilter 的添加和使用
  • 基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏
  • 实战交易策略 篇十七:翻倍黑马交易策略
  • Spring Data详解:简化数据访问层的开发实践
  • Socket
  • 【数据可视化-21】水质安全数据可视化:探索化学物质与水质安全的关联
  • python 脚本引用django中的数据库model
  • UnitTest框架
  • c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第七式】程序的编译
  • ARM Cortex-M (STM32)如何调试HardFault
  • vite详细打包配置,包含性能优化、资源处理...
  • 突破AI检测边界:对抗技术与学术伦理的终极博弈
  • 【HarmonyOS】ArKUI框架
  • 诠视科技MR眼镜如何使用头瞄点和UGUI交互
  • Filename too long 错误
  • XML内容解析成实体类
  • Java 中 XML 处理工具类详解