Android-知识-042-SQLlite数据库

95 阅读4分钟

Android SQLite 数据库

SQLite 是 Android 内置的轻量级关系型数据库,具有以下特点:

  • 小巧高效:无需单独安装,占用资源少。
  • 嵌入式数据库:数据存储在应用私有文件夹中。
  • 支持 SQL 语法:可以使用标准 SQL 对数据库进行操作。
  • 开箱即用:Android 提供了对 SQLite 的完整支持。

SQLite 数据库核心类

在 Android 中,操作 SQLite 数据库主要依赖以下核心类:

  1. SQLiteDatabase

    • 提供了操作 SQLite 数据库的 API,支持增删改查操作。
    • 可通过 openOrCreateDatabase() 方法打开数据库,或者使用 SQLiteOpenHelper 类来管理。
  2. SQLiteOpenHelper

    • 用于管理数据库的创建和版本控制。
    • 提供了便捷的方法来升级数据库和执行初始化操作。
  3. Cursor

    • 用于查询结果的迭代和访问。
    • 包含查询数据的结果集,可通过 moveToFirst()moveToNext() 遍历数据。

SQLite 使用流程

1. 创建数据库

使用 SQLiteOpenHelper 创建和管理数据库:

java
复制代码
public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "MyDatabase.db"; // 数据库名称
    private static final int DATABASE_VERSION = 1;               // 数据库版本

    // 创建表的 SQL 语句
    private static final String CREATE_TABLE = "CREATE TABLE user ("
            + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "name TEXT, "
            + "age INTEGER)";

    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级
        db.execSQL("DROP TABLE IF EXISTS user");
        onCreate(db);
    }
}

2. 打开数据库

通过 SQLiteOpenHelper 的实例获取数据库对象:

java
复制代码
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase(); // 可写数据库

3. 数据库操作

插入数据
java
复制代码
ContentValues values = new ContentValues();
values.put("name", "John");
values.put("age", 25);
db.insert("user", null, values); // 插入数据
更新数据
java
复制代码
ContentValues values = new ContentValues();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"John"}); // 更新数据
查询数据
java
复制代码
Cursor cursor = db.query("user", null, "name = ?", new String[]{"John"}, null, null, null);
if (cursor.moveToFirst()) {
    int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));
    String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
    Log.d("SQLite", "Name: " + name + ", Age: " + age);
}
cursor.close();
删除数据
java
复制代码
db.delete("user", "name = ?", new String[]{"John"}); // 删除数据

4. 关闭数据库

用完数据库后,需要关闭数据库和游标以释放资源:

java
复制代码
cursor.close();
db.close();

SQLiteOpenHelper 的方法

  • onCreate():首次创建数据库时调用,通常用于初始化数据库表结构。
  • onUpgrade():当数据库版本升级时调用,用于更新表结构或迁移数据。
  • getReadableDatabase():获取可读数据库对象。
  • getWritableDatabase():获取可写数据库对象。

SQLite 数据类型

SQLite 支持以下数据类型:

  • NULL:空值。
  • INTEGER:整数。
  • REAL:浮点数。
  • TEXT:字符串。
  • BLOB:二进制数据。

在 SQLite 中,数据类型是弱类型的,不严格校验数据类型,例如可以将整数存储到 TEXT 类型的列中。


SQLite 注意事项

  1. 数据库文件存储路径
    SQLite 数据库文件默认存储在应用的私有目录下:
    /data/data/<package_name>/databases/<database_name>

  2. 事务操作
    使用事务可以确保操作的原子性。

    java
    复制代码
    db.beginTransaction();
    try {
        // 执行多条 SQL 语句
        db.setTransactionSuccessful(); // 标记事务成功
    } finally {
        db.endTransaction();
    }
    
  3. 性能优化

    • 使用事务:减少 IO 操作的次数。
    • 避免频繁打开和关闭数据库。
    • 尽量使用批量操作。
  4. 多线程访问

    • SQLite 是线程安全的,但需要使用同一个数据库连接。
    • 避免多个线程同时访问同一个数据库对象。

完整示例

以下是一个增删改查的完整示例:

java
复制代码
public class MainActivity extends AppCompatActivity {

    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbHelper = new MyDatabaseHelper(this);

        // 插入数据
        insertData();

        // 查询数据
        queryData();

        // 更新数据
        updateData();

        // 删除数据
        deleteData();
    }

    private void insertData() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", "Alice");
        values.put("age", 23);
        db.insert("user", null, values);
    }

    private void queryData() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.query("user", null, null, null, null, null, null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
            int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));
            Log.d("SQLite", "Name: " + name + ", Age: " + age);
        }
        cursor.close();
    }

    private void updateData() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("age", 24);
        db.update("user", values, "name = ?", new String[]{"Alice"});
    }

    private void deleteData() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete("user", "name = ?", new String[]{"Alice"});
    }
}

SQLite 的替代方案

虽然 SQLite 是 Android 的内置数据库,但在某些场景下,其他数据库框架可能更适合:

  1. Room

    • Google 推荐的持久化库,基于 SQLite 构建,简化了数据库操作。
    • 提供了强大的注解支持和类型安全。
  2. Realm

    • 跨平台数据库,性能更高,易用性强,支持实时数据更新。
  3. GreenDAOORMLite

    • 第三方 ORM 框架,简化数据库操作。

总结

SQLite 是 Android 中强大的内置数据库,适用于大多数本地存储场景。通过 SQLiteOpenHelper,开发者可以轻松创建和管理数据库。但在复杂场景下,Google 推荐使用 Room 来提升开发效率和代码可维护性