在安卓开发中使用ADT(Android Development Tools)创建数据库通常是通过继承SQLiteOpenHelper类来实现,SQLiteOpenHelper是Android提供的数据库帮助类,用于管理数据库的创建和版本升级,以下是详细步骤和代码示例,帮助开发者完成数据库的创建与操作。
需要在Android Studio中创建一个新的项目或打开现有项目,确保项目中已添加必要的依赖,在app模块的build.gradle文件中,确保已添加Android SDK的支持,无需额外依赖SQLite库,因为Android系统已内置SQLite,创建一个继承自SQLiteOpenHelper的类,该类将负责数据库的创建和版本管理,以创建一个名为“MyDatabase”的数据库为例,定义数据库名称为“user.db”,版本号为1,并在构造函数中指定数据库名称和版本号。
在SQLiteOpenHelper的子类中,需要重写两个核心方法:onCreate()和onUpgrade(),onCreate()方法在数据库首次创建时调用,用于初始化数据库表结构;onUpgrade()方法在数据库版本升级时调用,用于处理表结构的变更,创建一个名为“User”的表,包含id(主键,自增)、name(文本)、age(整数)和email(文本)四个字段,在onCreate()方法中,使用SQL的CREATE TABLE语句创建表,并通过execSQL()执行SQL语句,需要注意的是,SQL语句中的表名和字段名应使用反引号(`)包裹,避免与SQL关键字冲突。
以下是SQLiteOpenHelper子类的代码示例:

public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "user.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_USER = "User";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_AGE = "age";
private static final String COLUMN_EMAIL = "email";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE_USER = "CREATE TABLE " + TABLE_USER + " ("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_NAME + " TEXT, "
+ COLUMN_AGE + " INTEGER, "
+ COLUMN_EMAIL + " TEXT)";
db.execSQL(CREATE_TABLE_USER);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
onCreate(db);
}
}
在Activity或其他组件中使用该数据库时,首先需要创建MyDatabaseHelper的实例,并通过getWritableDatabase()或getReadableDatabase()方法获取数据库对象,getWritableDatabase()用于读写操作,getReadableDatabase()用于读操作,若数据库不可写则返回只读对象,在Activity中插入数据:
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, "张三"); values.put(COLUMN_AGE, 25); values.put(COLUMN_EMAIL, "zhangsan@example.com"); long newRowId = db.insert(TABLE_USER, null, values); db.close();
查询数据时,可以使用query()方法或rawQuery()方法执行SQL语句,查询所有用户数据:
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_USER, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
int age = cursor.getInt(cursor.getColumnIndex(COLUMN_AGE));
String email = cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL));
// 处理查询结果
} while (cursor.moveToNext());
}
cursor.close();
db.close();
更新和删除数据分别使用update()和delete()方法,例如更新用户年龄:
ContentValues values = new ContentValues();
values.put(COLUMN_AGE, 26);
String selection = COLUMN_NAME + " = ?";
String[] selectionArgs = {"张三"};
db.update(TABLE_USER, values, selection, selectionArgs);
删除数据示例:

String selection = COLUMN_NAME + " = ?";
String[] selectionArgs = {"张三"};
db.delete(TABLE_USER, selection, selectionArgs);
在数据库操作过程中,需要注意异常处理和资源释放,在Cursor和SQLiteDatabase对象使用完毕后,应调用close()方法释放资源,避免内存泄漏,对于多线程操作,SQLite是线程安全的,但每个线程应使用独立的数据库连接对象。
以下是数据库操作中常见的错误及解决方法:
| 错误类型 | 可能原因 | 解决方法 |
|---|---|---|
| 数据库未创建 | 数据库名称或路径错误 | 检查SQLiteOpenHelper构造函数中的数据库名称,确保路径正确 |
| SQL语法错误 | 表名或字段名未使用反引号,或数据类型不匹配 | 使用反引号包裹表名和字段名,检查SQL语句语法 |
| Cursor未关闭 | 导致内存泄漏 | 在finally块中关闭Cursor,或使用try-with-resources语句 |
相关问答FAQs:
Q1: 如何在数据库升级时保留原有数据?
A1: 在onUpgrade()方法中,可以通过备份数据、重建表后恢复数据的方式保留原有数据,先将旧表的数据查询并存储到List中,删除旧表后创建新表,再将数据插入新表,代码示例如下:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 备份旧表数据
List<String> names = new ArrayList<>();
Cursor cursor = db.query(TABLE_USER, new String[]{COLUMN_NAME}, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
names.add(cursor.getString(0));
} while (cursor.moveToNext());
}
cursor.close();
// 删除旧表并创建新表
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
onCreate(db);
// 恢复数据(简化示例,实际需根据表结构调整)
for (String name : names) {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
db.insert(TABLE_USER, null, values);
}
}
Q2: 数据库操作时出现“database disk image is malformed”错误如何解决?
A2: 该错误通常是由于数据库文件损坏或存储空间不足导致的,解决方法包括:1. 检查设备存储空间,确保有足够剩余空间;2. 删除损坏的数据库文件(位于/data/data/<包名>/databases/目录),重启应用后重新创建数据库;3. 避免在事务未提交时强制关闭数据库,确保所有操作完成后调用close()方法。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/246715.html