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

安卓开发存储数据对象

安卓数据存储方式

安卓开发中存储数据对象的方式多样,根据数据类型、存储需求和生命周期选择合适的方案,以下是常见存储方式及特点:

存储方式 数据类型支持 持久化 适用场景
SharedPreferences 简单键值对(字符串、布尔等) 轻量级配置、用户偏好设置
文件存储 文本、二进制(如图片、视频) 是(内部存储)/可选(外部存储) 配置文件、缓存文件、多媒体资源
SQLite 数据库 结构化数据(表、行、列) 复杂业务数据、关系型数据存储
ContentProvider 跨应用数据共享 系统级数据共享(如联系人、媒体库)
Room 持久库 结构化数据(基于 SQLite) 复杂数据库操作,结合 LiveData

SharedPreferences 存储

特点

  • 键值对存储:仅支持基本数据类型(StringintfloatbooleanlongSet<String>)。
  • 轻量级:适合存储少量简单配置(如用户登录状态、主题设置)。
  • 自动持久化:数据默认保存在应用私有目录,无需手动管理。

实现步骤

// 获取 SharedPreferences 对象
SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE);
// 写入数据
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", "admin");
editor.putBoolean("isLoggedIn", true);
editor.apply(); // 异步提交
// 读取数据
String username = sp.getString("username", "default_value");
boolean isLoggedIn = sp.getBoolean("isLoggedIn", false);

文件存储

特点

  • 支持多种格式:文本文件(.txt)、二进制文件(图片、音频、视频)。
  • 可自定义路径:分为内部存储(自动清理)和外部存储(需申请权限)。
  • 权限管理:外部存储需动态申请 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

实现步骤

// 内部存储(无需权限)
File file = new File(getFilesDir(), "config.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("key=value".getBytes());
}
// 外部存储(Android 10+ 推荐使用 Scopeted Storage)
File externalFile = new File(getExternalFilesDir("documents"), "data.bin");
try (FileInputStream fis = new FileInputStream(externalFile)) {
    // 读取文件内容
}

SQLite 数据库

特点

  • 结构化存储:支持表、索引、事务,适合复杂业务逻辑。
  • 手动管理:需创建数据库、表结构,编写 SQL 语句。
  • 性能优势:适合大量数据存储和查询。

实现步骤

// 创建数据库助手类
public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context) {
        super(context, "app_database.db", null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}
// 增删改查操作
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("INSERT INTO users (name) VALUES (?)", new String[]{"Alice"});
Cursor cursor = db.rawQuery("SELECT  FROM users", null);

Room 持久库(基于 SQLite)

特点

  • 抽象层:通过注解生成代码,减少手写 SQL。
  • 编译时检查:避免运行时错误。
  • 集成 LiveData:支持观察数据变化。

实现步骤

// 定义实体类
@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
}
// 定义 DAO
@Dao
public interface UserDao {
    @Insert
    void insert(User user);
    @Query("SELECT  FROM users")
    LiveData<List<User>> getAllUsers();
}
// 创建数据库
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
// 使用
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_db").build();
UserDao dao = db.userDao();
dao.insert(new User());
dao.getAllUsers().observe(lifecycleOwner, users -> { / 更新 UI / });

常见问题与解答

问题1:如何选择存储方式?

  • 轻量级配置:使用 SharedPreferences
  • 文件资源:优先内部存储,若需共享则用外部存储。
  • 复杂数据:使用 SQLiteRoom
  • 跨应用共享:通过 ContentProvider

问题2:Room 相比直接使用 SQLite 有什么优势?

  • 代码简洁:通过注解自动生成 CRUD 代码,减少模板代码。
  • 类型安全:编译时检查 SQL 语句和字段匹配。
  • 实时响应:集成 LiveData,数据变更自动通知 UI。
  • 迁移支持:提供数据库版本迁移
0