MST

星途 面试题库

面试题:SQLite中SQLiteOpenHelper和SQLiteDatabase在Android开发中的协同使用

在Android开发中,简述SQLiteOpenHelper和SQLiteDatabase的作用以及它们是如何协同工作来管理SQLite数据库的创建、升级和数据操作的。请举例说明常见的操作场景及代码实现。
46.2万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

SQLiteOpenHelper的作用

  1. 数据库创建与升级管理:SQLiteOpenHelper是一个抽象类,用于帮助管理数据库的创建和版本管理。它提供了两个关键的抽象方法onCreate(SQLiteDatabase db)onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    • onCreate方法在数据库首次创建时调用,开发者可以在这个方法中执行创建表等初始化操作。
    • onUpgrade方法在数据库版本发生变化时调用,开发者可以在这个方法中执行数据迁移、表结构修改等操作。
  2. 方便获取数据库实例:通过子类化SQLiteOpenHelper并实现必要的方法,开发者可以方便地获取SQLiteDatabase实例。

SQLiteDatabase的作用

  1. 数据操作:SQLiteDatabase类用于执行SQL语句,进行数据库的增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作。它提供了一系列方法来方便地执行这些操作,而无需直接编写SQL语句(虽然也支持直接执行SQL语句)。
  2. 事务管理:支持事务操作,通过beginTransaction()setTransactionSuccessful()endTransaction()方法来管理事务,确保数据操作的原子性。

协同工作方式

  1. 创建数据库
    • 首先创建一个继承自SQLiteOpenHelper的类,例如MyDatabaseHelper。在构造函数中调用父类构造函数,传入上下文、数据库名、游标工厂(通常为null)和数据库版本。
    • 实现onCreate方法,在其中使用SQLiteDatabase实例创建表等结构。
    • 通过MyDatabaseHelper实例的getWritableDatabase()getReadableDatabase()方法获取SQLiteDatabase实例,此时如果数据库不存在,会调用onCreate方法创建数据库。
  2. 升级数据库
    • 当需要升级数据库时,修改MyDatabaseHelper构造函数中传入的数据库版本号。
    • 实现onUpgrade方法,在其中根据新旧版本号的差异执行相应的数据库结构或数据迁移操作。
    • 再次获取SQLiteDatabase实例时,如果版本号发生变化,会调用onUpgrade方法。

常见操作场景及代码实现

  1. 创建数据库和表
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "my_database.db";
    private static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "users";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "name";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " TEXT)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 简单示例:如果版本变化,删除旧表并重新创建
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}
  1. 插入数据
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseOperations {
    private MyDatabaseHelper myDatabaseHelper;

    public DatabaseOperations(Context context) {
        myDatabaseHelper = new MyDatabaseHelper(context);
    }

    public void insertData(String name) {
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MyDatabaseHelper.COLUMN_NAME, name);
        db.insert(MyDatabaseHelper.TABLE_NAME, null, contentValues);
        db.close();
    }
}
  1. 查询数据
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseOperations {
    //...

    public void queryData() {
        SQLiteDatabase db = myDatabaseHelper.getReadableDatabase();
        String[] projection = {MyDatabaseHelper.COLUMN_ID, MyDatabaseHelper.COLUMN_NAME};
        Cursor cursor = db.query(
                MyDatabaseHelper.TABLE_NAME,
                projection,
                null,
                null,
                null,
                null,
                null
        );
        if (cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_ID));
                String name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_NAME));
                // 处理查询结果
            } while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
    }
}
  1. 更新数据
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseOperations {
    //...

    public void updateData(int id, String newName) {
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MyDatabaseHelper.COLUMN_NAME, newName);
        String selection = MyDatabaseHelper.COLUMN_ID + " =?";
        String[] selectionArgs = {String.valueOf(id)};
        db.update(MyDatabaseHelper.TABLE_NAME, contentValues, selection, selectionArgs);
        db.close();
    }
}
  1. 删除数据
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseOperations {
    //...

    public void deleteData(int id) {
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        String selection = MyDatabaseHelper.COLUMN_ID + " =?";
        String[] selectionArgs = {String.valueOf(id)};
        db.delete(MyDatabaseHelper.TABLE_NAME, selection, selectionArgs);
        db.close();
    }
}