安卓系统提供了多种本地存储方式,开发者可根据数据类型和需求选择:
存储方式 | 适用场景 | 特点 |
---|---|---|
内部存储 | 存储敏感数据或应用专属文件(如配置文件、缓存) | 默认私有,无需申请权限 卸载应用时自动清除 |
外部存储 | 存储多媒体文件、下载内容等需要共享或长期保存的数据 | 需申请WRITE_EXTERNAL_STORAGE 权限(Android 10+需特殊处理)文件可见性取决于存储位置 |
SQLite数据库 | 结构化数据存储(如用户信息、日志) | 轻量级关系型数据库 支持复杂查询 |
SharedPreferences | 轻量级键值对存储(如用户设置、登录状态) | 基于XML文件 仅支持简单数据类型 |
缓存目录 | 临时文件存储(如图片缓存、网络数据) | 系统可自动清理 生命周期随应用卸载或缓存清除 |
// 获取内部存储目录 File file = new File(getFilesDir(), "example.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello Android".getBytes()); } catch (IOException e) { e.printStackTrace(); }
File file = new File(getFilesDir(), "example.txt"); try (FileInputStream fis = new FileInputStream(file)) { int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); String content = new String(buffer); } catch (IOException e) { e.printStackTrace(); }
// 创建公共图片文件(Android 10+推荐) ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "example.png"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try (OutputStream os = getContentResolver().openOutputStream(uri)) { // 写入文件内容(如Bitmap压缩) } catch (IOException e) { e.printStackTrace(); }
// 获取外部存储路径(需处理Android 10+限制) File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(externalDir, "example.txt");
创建与升级数据库
public class MyDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 处理数据库升级逻辑 } }
增删改查操作
SQLiteDatabase db = helper.getWritableDatabase(); // 插入数据 ContentValues values = new ContentValues(); values.put("name", "John"); db.insert("user", null, values); // 查询数据 Cursor cursor = db.query("user", null, null, null, null, null, null);
SharedPreferences prefs = getSharedPreferences("config", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("username", "admin"); editor.apply(); // 异步提交
SharedPreferences prefs = getSharedPreferences("config", MODE_PRIVATE); String username = prefs.getString("username", "default");
运行时权限申请(Android 6.0+)
// 检查并申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); }
Android 10+分区存储适配
MediaStore
或Storage Access Framework
操作外部存储。MANAGE_EXTERNAL_STORAGE
权限:仅适用于极端场景,需引导用户手动开启。问题 | 解决方案 |
---|---|
文件路径不存在或访问失败 | 检查存储空间是否充足 确认路径是否正确(如 getFilesDir() vs getExternalFilesDir() ) |
Android 10+外部存储写入失败 | 使用MediaStore API将文件存入应用专属外部存储目录( getExternalFilesDir() ) |
SQLite数据库文件过大 | 定期删除无用数据 分表存储或使用事务优化写入性能 |
SharedPreferences数据丢失 | 避免频繁调用commit() (改用apply() )检查文件读写冲突 |
MANAGE_EXTERNAL_STORAGE
权限?解答:
AndroidManifest.xml
中声明权限: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); startActivity(intent);
MediaStore
或Storage Access Framework
(Intent.ACTION_OPEN_DOCUMENT
)。解答:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Android 10+:使用Scoped Storage或应用专属目录 File externalDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); } else { // Android 9-:直接使用公共目录 File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); }
getExternalFilesDir()
、MediaStore
等API。