跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

在 Android 中使用 SQLite 数据库存储多值键值对并实现持久化读写

本文详解如何在 android 应用中通过 sqlite 数据库为每个唯一键(如 key1、key2)持久化存储 4 个关联字符串值,并支持运行时动态修改、重启后数据不丢失。 本文详解如何在 android 应用中通过 sqlite 数据库为每个唯一键(如 key1、key2)持久化存储 4 个关联字符串值,并支持运行时动态修改、重启后数据不丢失。 在 Android 开发中,若需为单个逻辑键(如 "key1")长期保存多个结构化字符串值(如 value1–value4),且要求应用重启后数据依然存在、可精确读取与更新, SharedPreferences 并不适用 ——它仅支持扁平化的 String → String/Boolean/Int/Long/Float/Set 映射,无法原生表达“一个键对应四个独立字段”的关系。而硬编码数组或内存集合更无法满足持久化需求。此时, 轻量级本地关系型数据库 SQLite 是最合理、标准且可扩展的解决方案 。 ✅ 推荐方案:自定义 SQLiteOpenHelper 管理结构化数据 我们设计一张表 entry_table,包含主键 id(自增)、唯一业务键 key_name(如 "key1"),以及四个字符串字段 val1, val2, val3, val4:
CREATE TABLE entry_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, key_name TEXT UNIQUE NOT NULL, val1 TEXT, val2 TEXT, val3 TEXT, val4 TEXT );
1. 创建数据库帮助类(DataHelper.java)
public class DataHelper extends SQLiteOpenHelper { private static final String DB_NAME = "multi_value_store.db"; private static final int DB_VERSION = 1; public DataHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE = "CREATE TABLE entry_table (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "key_name TEXT UNIQUE NOT NULL," + "val1 TEXT," + "val2 TEXT," + "val3 TEXT," + "val4 TEXT)"; db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS entry_table"); onCreate(db); } }
2. 封装数据操作:插入、查询、更新
public class DataManager { private DataHelper dbHelper; public DataManager(Context context) { this.dbHelper = new DataHelper(context); } // 插入或替换一条记录(key_name 唯一,重复则覆盖) public long insertOrUpdate(String key, String v1, String v2, String v3, String v4) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("key_name", key); values.put("val1", v1); values.put("val2", v2); values.put("val3", v3); values.put("val4", v4); return db.replace("entry_table", null, values); // replace 自动处理 INSERT/UPDATE } // 根据 key 查询,返回封装对象(推荐使用 POJO) public Entry getEntryByKey(String key) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("entry_table", new String[]{"val1", "val2", "val3", "val4"}, "key_name = ?", new String[]{key}, null, null, null); Entry entry = null; if (cursor != null && cursor.moveToFirst()) { entry = new Entry( cursor.getString(0), // val1 cursor.getString(1), // val2 cursor.getString(2), // val3 cursor.getString(3) // val4 ); cursor.close(); } return entry; } // 更新单个字段(例如只改 key1 的 val2) public int updateSingleValue(String key, String columnName, String newValue) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(columnName, newValue); return db.update("entry_table", values, "key_name = ?", new String[]{key}); } } // 简单数据载体类 public class Entry { public final String val1, val2, val3, val4; public Entry(String v1, String v2, String v3, String v4) { this.val1 = v1; this.val2 = v2; this.val3 = v3; this.val4 = v4; } }
3. 在 Activity 中使用示例
DataManager manager = new DataManager(this); // ✅ 写入:key1 对应四值 manager.insertOrUpdate("key1", "A", "B", "C", "D"); // ✅ 读取并赋值给变量 Entry e1 = manager.getEntryByKey("key1"); if (e1 != null) { String var1 = e1.val1; // "A" String var2 = e1.val2; // "B" // ... } // ✅ 持久化更新单个值(重启后仍生效) manager.updateSingleValue("key1", "val2", "NEW_B");
⚠️ 注意事项与最佳实践 线程安全 :SQLiteOpenHelper 实例建议全局单例(Application Context 初始化),避免多线程并发写入冲突;高频操作请考虑使用 beginTransaction() 手动事务。 错误处理 :生产代码中需检查 insertOrUpdate() 返回值(-1 表示失败),并捕获 SQLException。 扩展性提示 :若未来字段数增加或类型变化(如加入时间戳、布尔标记),SQLite 表结构可通过 onUpgrade() 安全迁移,远比文件解析鲁棒。 替代方案对比 : ✅ Room(推荐进阶) :Google 官方架构组件,基于 SQLite 封装,提供编译时 SQL 检查、LiveData 支持和简洁注解 API; ❌ 纯文件读写(JSON/CSV) :虽可行,但缺乏事务、索引与并发控制,易因异常导致数据损坏,不符合 Android 平台最佳实践。 通过上述 SQLite 方案,你不仅实现了“一个键映射四个字符串”的结构化持久化,更获得了工业级的可靠性、可维护性与扩展能力——这才是 Android 应用数据存储的正确打开方式。

相关文章