上一篇
安卓开发修改数据代码
- 行业动态
- 2025-04-23
- 4008
安卓修改数据可通过SQLite用ContentValues,SharedPreferences用edit(),文件用FileOutputStream,网络请求用Retrofit
安卓数据存储与修改方案
SharedPreferences 数据修改
操作步骤 | 代码示例 | 说明 |
---|---|---|
获取实例 | SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); | 通过名称获取偏好设置文件 |
修改数据 | “<br> SharedPreferences.Editor editor = sp.edit();<br> editor.putString(“username”, “new_user”);<br> editor.apply();“`| 使用Editor对象进行修改,需调用 apply()`提交 | |
批量修改 | “<br> editor.putInt(“age”, 25);<br> editor.putBoolean(“isLogin”, true);<br> editor.commit();“`commit()会同步写入, apply()`异步更高效 |
SQLite 数据库修改
// 获取可写数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); // 更新数据(修改年龄为30) ContentValues values = new ContentValues(); values.put("age", 30); db.update("users", values, "id=?", new String[]{"1"}); // 删除数据(根据条件删除) db.delete("orders", "status=?", new String[]{"canceled"}); // 插入新数据 String sql = "INSERT INTO products (name, price) VALUES (?, ?)"; db.execSQL(sql, new Object[]{"Phone", 2999});
Room 持久化库修改
@Dao public interface UserDao { // 更新操作 @Update void updateAge(int age, int userId); // 删除操作 @Delete void deleteUser(User user); } // 使用示例 userDao.updateAge(28, 1001); // 将ID为1001的用户年龄改为28
文件存储修改
// 写入新内容(覆盖模式) try(FileOutputStream fos = openFileOutput("data.txt", MODE_PRIVATE)) { fos.write("new content".getBytes()); } try(FileOutputStream fos = openFileOutput("data.txt", MODE_APPEND)) { fos.write(" append text".getBytes()); }
ContentProvider 数据修改
// 通过ContentResolver修改联系人数据 ContentValues values = new ContentValues(); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13800000000"); getContentResolver().update( ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId), values, null, null);
数据修改注意事项
类型 | 关键操作 | 风险点 |
---|---|---|
SharedPreferences | apply()/commit() | 未提交导致数据丢失 |
SQLite | 事务处理 | 忘记关闭Cursor导致内存泄漏 |
Room | LiveData观察 | 主线程操作引发ANR |
文件存储 | 模式选择 | 覆盖模式会清空原有内容 |
ContentProvider | 权限校验 | 未声明provider会抛出安全异常 |
常见问题与解答
Q1:为什么SharedPreferences修改后数据没有生效?
A1:可能原因:
- 忘记调用
apply()
或commit()
方法 - 使用了错误的文件名获取实例
- 修改的Key与读取时不一致
- 多进程访问导致数据未同步(建议使用
apply()
)
Q2:Room数据库批量更新失败怎么办?
A2:解决方案:
- 检查@Update注解是否配置正确
- 确保实体类包含
@PrimaryKey
字段 - 使用
inTransaction()
包裹批量操作 - 检查冲突策略(如
OnConflictStrategy.REPLACE