09 数据存储¶
App 要记住数据(登录状态、设置项、收藏列表……),安卓提供几种由轻到重的存储方式。
9.1 SharedPreferences(轻量键值对,首选)¶
适合存"少量简单数据":开关状态、用户名、最后选择等。本质是一个 XML 文件。
// 写入
SharedPreferences sp = getSharedPreferences("my_prefs", MODE_PRIVATE);
sp.edit()
.putString("username", "pyz")
.putBoolean("remember_me", true)
.putInt("level", 10)
.apply(); // apply 异步写入;也可用 commit()(同步,返回是否成功)
// 读取
SharedPreferences sp2 = getSharedPreferences("my_prefs", MODE_PRIVATE);
String name = sp2.getString("username", ""); // 第二个参数是默认值
boolean remember = sp2.getBoolean("remember_me", false);
9.2 文件存储(保存文档/日志/缓存)¶
// 写入内部存储(App 私有,卸载即清)
String content = "要保存的内容";
try (FileOutputStream fos = openFileOutput("note.txt", MODE_PRIVATE)) {
fos.write(content.getBytes());
}
// 读取
FileInputStream fis = openFileInput("note.txt");
byte[] buf = new byte[fis.available()];
fis.read(buf);
String text = new String(buf);
- 内部存储:
getFilesDir()下,其他 App 访问不到,无需权限; - 外部存储:
getExternalFilesDir(),App 专属目录无需权限;公共目录(Download/Pictures)Android 10+ 用 MediaStore,需要权限。
9.3 SQLite / Room(结构化数据)¶
数据多了(上百条要查询筛选的),用数据库。原生 SQLite 写起来繁琐,官方推荐 Room 封装库。
Room 三步:实体 → DAO → 数据库
// ① 实体类(对应一张表)
@Entity(tableName = "articles")
public class Article {
@PrimaryKey(autoGenerate = true)
public long id;
public String title;
public String content;
}
// ② DAO 接口(写 SQL)
@Dao
public interface ArticleDao {
@Insert
void insert(Article article);
@Query("SELECT * FROM articles ORDER BY id DESC")
List<Article> getAll();
}
// ③ 数据库类
@Database(entities = {Article.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract ArticleDao articleDao();
}
使用:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "app.db").build();
ArticleDao dao = db.articleDao();
// 子线程里操作(数据库不允许在主线程跑)
new Thread(() -> {
dao.insert(article);
List<Article> all = dao.getAll();
runOnUiThread(() -> {/* 更新界面 */});
}).start();
依赖(build.gradle.kts):
implementation("androidx.room:room-runtime:2.6.1")
annotationProcessor("androidx.room:room-compiler:2.6.1")
9.4 选型速查¶
| 需求 | 方案 |
|---|---|
| 记住开关/用户名/设置 | SharedPreferences |
| 存一段文字/文件 | 文件存储 |
| 结构化列表、要查询 | Room / SQLite |
| 图片等大文件 | 存文件,路径记进数据库 |
⚠️ Room 需要
annotationProcessor配置,否则编译报错找不到生成的实现类。
本章练习:用 SharedPreferences 实现"记住用户名",重启 App 后输入框自动填上。