前语

数据存储Android 运用开发的一个关键方面。不管你需要存储用户偏好设置、缓存数据还是耐久保存结构化信息,了解 Android 中的各种数据存储选项至关重要。在本文中,咱们将逐步深化探讨 Android 中的不同数据存储技能,从基础知识开始逐步深化更高级的选项。

SharedPreferences

SharedPreferences 是一种轻量级且简略的存储键值对的办法。通常用于存储用户偏好设置或小量数据。运用 SharedPreferences,按照以下过程进行操作:

  1. 初始化:运用 getSharedPreferences() 办法获取 SharedPreferences 目标的引证。你能够从运用程序上下文或活动上下文中获取 SharedPreferences 目标。
javaCopy code
SharedPreferences sharedPreferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE);
  1. 写入数据:运用 edit() 办法获取 SharedPreferences.Editor 的实例,然后运用不同的 putX() 办法存储所需的数据类型。
javaCopy code
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username", "John");
editor.putInt("age", 25);
editor.apply();
  1. 读取数据:运用相应的 getX() 办法检索数据,指定键并在键不存在时供给默认值。
javaCopy code
String username = sharedPreferences.getString("username", "默认值");
int age = sharedPreferences.getInt("age", 0);

SQLite 数据库

关于结构化数据存储,Android 供给了强壮的联系型数据库办理系统 SQLite。它供给了运用 SQL 查询来办理数据的高效办法。以下是在 Android 中运用 SQLite 的办法:

  1. 创立数据库:扩展 SQLiteOpenHelper 类以创立自界说的数据库辅助类。重写 onCreate() 办法来界说数据库模式并履行必要的 SQL 语句。
javaCopy code
public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "my_database.db";
    private static final int DATABASE_VERSION = 1;
    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTableQuery = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)";
        db.execSQL(createTableQuery);
    }
    // ...
}
  1. 履行数据库操作:运用 SQLiteDatabase 类在数据库上履行 CRUD(创立、读取、更新、删除)操作。
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 刺进记载
ContentValues values = new ContentValues();
values.put("name", "John Doe");
long insertedId = db.insert("users", null, values);
// 查询记载
Cursor cursor = db.query("users", null, null, null, null, null, null);
while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
    // 处理检索到的数据
}
// 更新记载
ContentValues updatedValues = new ContentValues();
updatedValues.put("name", "Jane Doe");
db.update("users", updated// 更新记载
ContentValues updatedValues = new ContentValues();
updatedValues.put("name", "Jane Doe");
db.update("users", updatedValues, "id=?", new String[] { String.valueOf(userId) });
// 删除记载
db.delete("users", "id=?", new String[] { String.valueOf(userId) });
// ...

Room 耐久性库

Room 耐久性库是 Android Jetpack 的一部分,它是对 SQLite 的笼统层,供给了更简略、更高效的数据库操作办法。它消除了样板代码,并供给了在编译时对 SQL 查询进行验证的功能。要运用 Room,请按照以下过程进行操作:

  1. 在项目中增加 Room:在运用级别的 build.gradle 文件中包括以下依靠项:
groovyCopy code
implementation 'androidx.room:room-runtime:2.4.0'
annotationProcessor 'androidx.room:room-compiler:2.4.0'
  1. 界说实体:实体代表数据库中的表。创立一个运用 @Entity 注解的类,并将列及其类型界说为字段。
javaCopy code
@Entity(tableName = "users")
public class User {
    @PrimaryKey
    public int id;
    public String name;
}
  1. 创立数据库:创立一个承继自 RoomDatabase 的笼统类,并界说实体和数据库版本。
javaCopy code
@Database(entities = {User.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
  1. 拜访数据:界说一个运用 @Dao 注解的数据拜访目标(DAO)接口。声明用于履行数据库操作的办法。
javaCopy code
@Dao
public interface UserDao {
    @Insert
    void insert(User user);
    @Query("SELECT * FROM users")
    List<User> getAllUsers();
    // ...
}
  1. 运用 Room:运用 Room.databaseBuilder() 获取数据库实例,并拜访 DAO 履行数据库操作。
javaCopy code
MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my_database.db")
        .build();
UserDao userDao = myDatabase.userDao();
// 刺进记载
User user = new User();
user.id = 1;
user.name = "John Doe";
userDao.insert(user);
// 查询记载
List<User> userList = userDao.getAllUsers();
// ...

经过使用 Room,你能够受益于其编译时检查、LiveData 集成以及简化的数据库操作等功能。

总结

在本文中,咱们探讨了 Android 中的不同数据存储技能。咱们从 Shared Preferences 开始存储键值对,然后深化介绍了 SQLite 数据库作为结构化数据存储的强壮东西,并引入了 Room 耐久性库作为一个便利且强壮的 SQLite 笼统层。经过了解这些存储选项,你能够有效地办理 Android 运用程序中的数据,并供给流通的用户体会。

在挑选适当的数据存储技能时,请考虑你的运用需求和数据的性质。每个选项都有其优势和适用场景,因此在具体需求下进行评估非常重要。