当前位置:首页 > 行业动态 > 正文

安卓开发中数据存储方式

安卓数据存储方式:SharedPreferences存键值对配置,SQLite处理结构化数据,文件存储管理多媒体,网络存储实现云端同步,按需选择适配

SharedPreferences(轻量级键值对存储)

  • 定义:基于XML文件的键值对存储,适合保存简单配置信息。
  • 使用场景:用户偏好设置、登录状态、简单配置参数。
  • API方法
    • getSharedPreferences(String name, int mode):获取实例。
    • edit():获取编辑器对象。
    • putString(String key, String value):存入数据。
    • commit():同步提交;apply():异步提交。
  • 示例代码
    SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
    sp.edit().putBoolean("isLogin", true).apply();
    boolean isLogin = sp.getBoolean("isLogin", false);
  • 优点:简单易用,无需创建文件或数据库。
  • 缺点:仅支持基本数据类型,不适合复杂数据结构。

文件存储(File)

  • 定义:通过FileInputStreamFileOutputStream读写设备中的文件,支持文本和二进制数据。

  • 使用场景:配置文件、图片/视频等多媒体文件、缓存数据。

  • API方法

    • openFileInput(String name):读取内部存储文件。
    • openFileOutput(String name, int mode):写入内部存储文件。
  • 示例代码

    // 写入文件
    FileOutputStream fos = openFileOutput("data.txt", Context.MODE_PRIVATE);
    fos.write("Hello World".getBytes());
    fos.close();
    // 读取文件
    FileInputStream fis = openFileInput("data.txt");
    BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
    String line = reader.readLine();
    fis.close();
  • 优点:灵活,支持任意格式数据。

  • 缺点:需手动管理文件路径和IO流,安全性需注意。


SQLite数据库(结构化存储)

  • 定义:轻量级关系型数据库,通过SQLiteOpenHelper管理版本和表结构。
  • 使用场景:复杂数据结构、多表关联、大量数据存储(如记账应用)。
  • API方法
    • SQLiteDatabase.execSQL(String sql):执行SQL语句。
    • insert()/update()/delete():增删改操作。
    • rawQuery(String sql, String[] args):查询数据。
  • 示例代码
    SQLiteDatabase db = helper.getWritableDatabase();
    db.execSQL("CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT)");
    ContentValues values = new ContentValues();
    values.put("name", "Alice");
    db.insert("user", null, values);
  • 优点:支持复杂查询和事务。
  • 缺点:需手动处理SQL语句和数据库操作,学习成本较高。

ContentProvider(跨应用数据共享)

  • 定义:Android四大组件之一,提供统一接口访问其他应用的数据(如通讯录、媒体库)。
  • 使用场景:共享数据给其他应用(如自定义ContentProvider暴露本地数据)。
  • 核心方法
    • query(Uri uri, String[] projection, String selection):查询数据。
    • insert(Uri uri, ContentValues values):插入数据。
    • update(Uri uri, ContentValues values, String selection):更新数据。
    • delete(Uri uri, String selection):删除数据。
  • 示例代码
    // 访问系统通讯录
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
  • 优点:支持跨进程数据共享,权限控制严格。
  • 缺点:实现复杂,需处理Uri匹配和权限管理。

网络存储(远程数据交互)

  • 定义:通过HTTP/HTTPS与服务器交互,存储数据到云端(如REST API、WebSocket)。
  • 使用场景:需要多设备同步、海量数据存储(如社交应用、电商应用)。
  • 工具RetrofitOkHttpVolley等网络库。
  • 示例代码
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    ApiService service = retrofit.create(ApiService.class);
    Call<User> call = service.getUser(123);
    call.enqueue(new Callback<User>() { ... });
  • 优点:数据可同步到多端,无本地存储容量限制。
  • 缺点:依赖网络,需处理网络异常和数据加密。

Room(SQLite的抽象层)

  • 定义:基于SQLite的ORM框架,提供编译时验证和流畅API。

  • 核心组件

    • @Entity:标注数据库表。
    • @Dao:定义数据访问方法。
    • @Database:标注数据库类。
  • 示例代码

    @Entity
    public class User {
        @PrimaryKey public int id;
        public String name;
    }
    @Dao
    public interface UserDao {
        @Insert public void insert(User user);
        @Query("SELECT  FROM User") public List<User> getAll();
    }
    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
  • 优点:减少SQL代码,支持LiveData实时监听。

  • 缺点:学习成本较高,需理解注解和架构。


DataStore(键值对存储的现代方案)

  • 定义:Google推荐的替代SharedPreferences的组件,支持类型安全和异步处理。
  • 类型
    • PreferenceDataStore:兼容原有键值对。
    • ProtoDataStore:支持Protocol Buffer协议。
  • 示例代码
    val dataStore = context.createDataStore(name = "settings")
    dataStore.edit { preferences ->
        preferences[String("key")] = "value"
    }
  • 优点:线程安全,支持Kotlin协程。
  • 缺点:需引入依赖库,部分旧项目适配成本高。

存储方式对比表

存储方式 数据类型 持久化 适用场景 性能特点
SharedPreferences 键值对(基本类型) 简单配置、状态保存 读写快,占用小
文件存储 任意格式(文本/二进制) 配置文件、多媒体文件 大文件读写较慢
SQLite 结构化数据(表/关系) 复杂数据、本地数据库应用 查询高效,操作复杂
ContentProvider 公开数据(Uri接口) 跨应用共享数据 依赖系统调度
网络存储 云端数据(JSON/二进制) 否(需网络) 多端同步、远程服务 依赖网络稳定性
Room 结构化数据(对象映射) 需要ORM和编译时校验的场景 开发效率高
DataStore 键值对(类型安全) 替代SharedPreferences的现代方案 异步友好,易扩展

相关问题与解答

问题1:如何根据需求选择数据存储方式?

解答

  • 简单配置:优先使用SharedPreferencesDataStore
  • 文件类数据:图片、音视频等用文件存储;配置文件可用JSON/XML文件。
  • 结构化数据:需关联查询或复杂操作时选SQLite或Room。
  • 跨应用共享:必须使用ContentProvider
  • 云端同步:结合本地存储(如Room)+ 网络存储。

问题2:如何实现SQLite数据库的加密存储?

解答

  1. 使用SQLCipher库(开源SQLite加密扩展)。
  2. SQLiteOpenHelper中初始化加密数据库:
    net.sqlcipher.database.SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(encryptedFile, "password");
  3. 所有CRUD操作均通过加密后的db对象完成
0