SQLiteOpenHelper的作用
- 数据库创建与升级管理:SQLiteOpenHelper是一个抽象类,用于帮助管理数据库的创建和版本管理。它提供了两个关键的抽象方法
onCreate(SQLiteDatabase db)
和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
。
onCreate
方法在数据库首次创建时调用,开发者可以在这个方法中执行创建表等初始化操作。
onUpgrade
方法在数据库版本发生变化时调用,开发者可以在这个方法中执行数据迁移、表结构修改等操作。
- 方便获取数据库实例:通过子类化SQLiteOpenHelper并实现必要的方法,开发者可以方便地获取
SQLiteDatabase
实例。
SQLiteDatabase的作用
- 数据操作:SQLiteDatabase类用于执行SQL语句,进行数据库的增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作。它提供了一系列方法来方便地执行这些操作,而无需直接编写SQL语句(虽然也支持直接执行SQL语句)。
- 事务管理:支持事务操作,通过
beginTransaction()
、setTransactionSuccessful()
和endTransaction()
方法来管理事务,确保数据操作的原子性。
协同工作方式
- 创建数据库:
- 首先创建一个继承自SQLiteOpenHelper的类,例如
MyDatabaseHelper
。在构造函数中调用父类构造函数,传入上下文、数据库名、游标工厂(通常为null
)和数据库版本。
- 实现
onCreate
方法,在其中使用SQLiteDatabase
实例创建表等结构。
- 通过
MyDatabaseHelper
实例的getWritableDatabase()
或getReadableDatabase()
方法获取SQLiteDatabase
实例,此时如果数据库不存在,会调用onCreate
方法创建数据库。
- 升级数据库:
- 当需要升级数据库时,修改
MyDatabaseHelper
构造函数中传入的数据库版本号。
- 实现
onUpgrade
方法,在其中根据新旧版本号的差异执行相应的数据库结构或数据迁移操作。
- 再次获取
SQLiteDatabase
实例时,如果版本号发生变化,会调用onUpgrade
方法。
常见操作场景及代码实现
- 创建数据库和表:
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);
}
}
- 插入数据:
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();
}
}
- 查询数据:
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();
}
}
- 更新数据:
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();
}
}
- 删除数据:
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();
}
}