Android速成day05-数据存储

一年经验的全栈程序员,目前头发健在,但不知道能撑多久。

目录

前言

一、 SharedPreferences(共享偏好设置)

适用场景

特点

二、内部存储(Internal Storage)

适用场景

特点

三、外部存储(公共文件存储)

适用场景

特点

四、SQLite数据库(关系型数据库)

 适用场景

特点

五. Room(SQLite的现代化封装)

适用场景

特点

六. DataStore(SharedPreferences替代方案) 

适用场景

特点

如何选择存储方式? 

总结

 🙌 求点赞、收藏、关注! 


前言

在安卓应用开发中,数据存储是至关重要的环节。无论是保存用户的个性化设置、缓存网络请求的数据,还是管理复杂的结构化信息,选择合适的数据存储方式直接影响着应用的性能、安全性和用户体验。

然而,面对多种存储方案——从简单的键值对 SharedPreferences 到强大的 SQLite 数据库,再到现代化的 Room 和 DataStore——许多开发者可能会感到困惑:什么时候该用哪种方案?它们各自有什么优缺点?

本文将全面解析安卓开发中的数据存储技术,用通俗易懂的语言和实用代码示例,带你了解:

  • 各种存储方式的核心特点适用场景

  • 如何根据需求选择最佳存储方案

  • 从传统方法到最新推荐(如 DataStore 替代 SharedPreferences

无论你是安卓新手,还是希望系统梳理存储知识的开发者,这篇文章都能帮助你高效管理应用数据,打造更稳定、更流畅的应用!


一、 SharedPreferences(共享偏好设置)

SharedPreferences是Android的一个轻量级存储工具,它采用的存储结构Key-Value的键值对方式,SharedPreferences的存储介质是XML文件,且以XML标记保存键值对。保存共享参数键值对信息的文件路径为:/data/data/应用包名/shared prefs/文件名.xml。

适用场景

  • 存储简单的键值对数据(如用户设置、应用配置)

  • 不适合存储复杂或大量数据

特点

✅ 优点

  • 使用简单,适合存储少量数据

  • 自动管理文件读写

❌ 缺点

  • 只能存储基本数据类型(StringIntBoolean等)

  • 不适合多线程高并发操作

// 写入数据
SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("username", "张三");
editor.putInt("login_count", 5);
editor.apply(); // 异步提交

// 读取数据
String username = prefs.getString("username", "default");
int loginCount = prefs.getInt("login_count", 0);

二、内部存储(Internal Storage)

内部存储将文件保存在应用私有目录,其他应用无法访问,适合存储敏感数据或缓存文件。

适用场景

  • 存储应用私有文件(其他应用无法访问)

  • 存储敏感数据(如缓存、临时文件)

特点

✅ 优点

  • 数据受系统保护,安全性高

  • 卸载应用时自动清除

❌ 缺点

  • 存储空间有限

  • 用户无法直接访问

// 写入文件
String filename = "notes.txt";
String content = "Hello Internal Storage!";
try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) {
    fos.write(content.getBytes());
}

// 读取文件
try (FileInputStream fis = openFileInput(filename)) {
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    String fileContent = sb.toString();
}

三、外部存储(公共文件存储)

外部存储保存文件到公共目录(如Downloads、Pictures),可供其他应用访问。

适用场景

  • 存储用户可见的大文件(图片、视频、文档)

  • 需要跨应用共享的数据

特点

✅ 优点

  • 存储空间大

  • 用户可访问和管理

❌ 缺点

  • 需要动态权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

  • 不同设备兼容性问题

// 检查存储可用性
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    // 获取应用私有目录(无需权限)
    File appDir = new File(getExternalFilesDir(null), "MyApp");
    
    // 写入文件
    File file = new File(appDir, "data.txt");
    try (FileWriter writer = new FileWriter(file)) {
        writer.write("External storage demo");
    }
    
    // 读取公共下载目录(需要权限)
    File downloadsDir = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS);
    File publicFile = new File(downloadsDir, "public_file.txt");
}

四、SQLite数据库(关系型数据库)

SQLite是Android内置的轻量级关系型数据库,适合存储结构化数据。

 适用场景

  • 存储结构化数据(如用户信息、订单记录)

  • 需要复杂查询、排序、分页等操作

特点

✅ 优点

  • 轻量级、高性能

  • 支持SQL标准语法

❌ 缺点

  • 需要手动管理数据库升级

  • 代码较繁琐

// 数据库帮助类
public class DbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "users.db";
    private static final int DB_VERSION = 1;
    
    public DbHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE users (" +
            "_id INTEGER PRIMARY KEY," +
            "name TEXT," +
            "age INTEGER)");
    }
}

// 数据库操作
DbHelper dbHelper = new DbHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();

// 插入数据
ContentValues values = new ContentValues();
values.put("name", "李四");
values.put("age", 28);
long id = 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();


. Room(SQLite的现代化封装)

Room是Google推荐的数据库库,在SQLite基础上提供更安全的API。 

适用场景

  • 替代原生SQLite,简化数据库操作

  • 需要类型安全、编译时检查的数据库方案

特点

✅ 优点

  • 减少样板代码

  • 支持LiveData、RxJava、协程

  • 提供DAO(数据访问对象)模式

❌ 缺点

  • 学习成本略高

// 数据库帮助类
public class DbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "users.db";
    private static final int DB_VERSION = 1;
    
    public DbHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE users (" +
            "_id INTEGER PRIMARY KEY," +
            "name TEXT," +
            "age INTEGER)");
    }
}

// 数据库操作
DbHelper dbHelper = new DbHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();

// 插入数据
ContentValues values = new ContentValues();
values.put("name", "李四");
values.put("age", 28);
long id = 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();

六. DataStore(SharedPreferences替代方案) 

DataStore是Google推出的新存储方案,解决SharedPreferences的缺陷。

适用场景

  • 替代SharedPreferences,存储键值对或小型结构化数据

  • 需要协程支持、类型安全的配置存储

特点

✅ 优点

  • 支持协程异步操作

  • 提供两种实现:Preferences DataStore 和 Proto DataStore

❌ 缺点

  • 需要Kotlin支持

// 在Kotlin中定义(Java需通过Kotlin桥接)
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

// 写入数据(Java调用示例)
CoroutineScope(Dispatchers.IO).launch {
    context.dataStore.edit { prefs ->
        prefs[intPreferencesKey("counter")] = 100
    }
}

// 读取数据(Java调用示例)
Flow<Integer> counterFlow = DataStoreHelper.getCounterFlow(context);

如何选择存储方式? 

存储方式适用场景数据量是否结构化是否需要网络
SharedPreferences简单配置❌ 非结构化❌ 本地
内部存储私有文件❌ 文件存储❌ 本地
外部存储用户可见文件❌ 文件存储❌ 本地
SQLite结构化数据中-大✅ 结构化❌ 本地
Room现代化数据库中-大✅ 结构化❌ 本地
DataStore替代SharedPreferences❌ 键值对❌ 本地

总结

在安卓开发中,不同的数据存储方式适用于不同的场景:

  • 简单配置 → SharedPreferences / DataStore

  • 私有文件 → 内部存储

  • 用户文件 → 外部存储

  • 结构化数据 → SQLite / Room

选择合适的存储方案,可以让你的应用更高效、更稳定!希望这篇指南能帮助你更好地管理安卓应用中的数据存储。 🚀


 🙌 求点赞、收藏、关注! 

如果这篇文章对你有帮助,不妨:
👍 点个赞 → 让更多人看到这篇干货!
⭐ 收藏一下 → 方便以后随时查阅!
🔔 加关注 → 获取更多 前端/后端/全栈技术深度解析

你的支持,是我持续创作的最大动力! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二七有头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值