跳转至

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 后输入框自动填上。

🏠 返回总站