SQLite是一种轻量级、嵌入式的关系型数据库引擎,因其无需独立服务器、零配置、跨平台等特性,在移动应用开发(尤其是Android)中得到了广泛应用,在Android Studio(简称AS)中创建和操作SQLite数据库,是本地数据存储的核心技能之一,本文将详细介绍在Android Studio中创建SQLite数据库的完整流程、关键步骤及最佳实践,帮助开发者高效实现本地数据管理。

SQLite数据库基础
SQLite是一个进程内的库,它实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎,其核心特点包括:
- 轻量级:核心库大小约数百KB,适合资源受限的移动设备;
- 无服务器:无需独立的服务器进程,数据库直接存储为磁盘文件;
- 事务支持:完全支持ACID(原子性、一致性、隔离性、持久性)事务;
- 跨平台:支持Windows、Linux、macOS、Android等多种操作系统。
在Android应用中,SQLite数据库默认存储在应用的私有目录下(/data/data/<包名>/databases/),其他应用无法直接访问,确保了数据安全性。
Android Studio中创建SQLite数据库的步骤
在Android Studio中创建SQLite数据库,通常通过继承SQLiteOpenHelper类来实现,该类提供了数据库创建、版本升级等核心功能,以下是详细步骤:
创建数据库帮助类(继承SQLiteOpenHelper)
SQLiteOpenHelper是一个抽象类,需重写以下关键方法:
onCreate(SQLiteDatabase db):首次创建数据库时调用,用于初始化数据库表结构;onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):数据库版本升级时调用,用于修改表结构或迁移数据。
示例代码:

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";
// 创建表的SQL语句
private static final String CREATE_TABLE_USER =
"CREATE TABLE " + TABLE_USER + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL, " +
COLUMN_AGE + " INTEGER" + ")";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_USER); // 执行建表SQL
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 版本升级时,删除旧表(实际开发中需迁移数据)
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
onCreate(db); // 重新创建表
}
}
实例化数据库帮助类并获取数据库对象
在Activity或其他组件中,通过MyDatabaseHelper的实例获取可读(getReadableDatabase())或可写(getWritableDatabase())的SQLiteDatabase对象。
示例代码:
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化数据库帮助类
dbHelper = new MyDatabaseHelper(this);
// 获取可写数据库
db = dbHelper.getWritableDatabase();
}
}
执行数据库操作(增删改查)
获取SQLiteDatabase对象后,可通过SQL语句或API方法执行数据操作,以下为常见操作示例:
-
插入数据:
使用insert()方法,通过ContentValues存储键值对数据。ContentValues values = new ContentValues(); values.put(COLUMN_NAME, "张三"); values.put(COLUMN_AGE, 25); long rowId = db.insert(TABLE_USER, null, values); // 返回新行ID
-
查询数据:
使用query()方法,支持条件查询、排序等。
Cursor cursor = db.query(TABLE_USER, new String[]{COLUMN_ID, COLUMN_NAME, COLUMN_AGE}, COLUMN_AGE + " > ?", new String[]{"20"}, null, null, COLUMN_NAME); if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID)); String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME)); int age = cursor.getInt(cursor.getColumnIndex(COLUMN_AGE)); // 处理数据 } while (cursor.moveToNext()); } cursor.close(); -
更新数据:
使用update()方法,通过ContentValues更新指定条件的数据。ContentValues values = new ContentValues(); values.put(COLUMN_AGE, 26); int rows = db.update(TABLE_USER, values, COLUMN_NAME + " = ?", new String[]{"张三"}); -
删除数据:
使用delete()方法,根据条件删除数据。int rows = db.delete(TABLE_USER, COLUMN_ID + " = ?", new String[]{"1"});
最佳实践
- 线程安全:数据库操作是耗时任务,需在子线程中执行,避免阻塞UI线程(可使用
AsyncTask、ExecutorService或RxJava)。 - 事务管理:多个操作需保证原子性时,使用事务(
beginTransaction()、setTransactionSuccessful()、endTransaction())。 - 避免SQL注入:查询时使用占位符()而非字符串拼接,防止恶意SQL执行。
- 版本升级与数据迁移:
onUpgrade()中需谨慎处理旧数据,可通过临时表备份、修改表结构后恢复数据,避免数据丢失。
相关问答FAQs
Q1:为什么SQLite数据库操作不能在主线程中进行?
A:Android系统规定,网络操作和数据库IO等耗时任务不能在主线程(UI线程)中执行,否则会抛出NetworkOnMainThreadException或导致应用无响应(ANR),数据库操作涉及磁盘读写,可能阻塞UI,因此需在子线程中执行,或使用AsyncTask、Room等框架简化异步操作。
Q2:如何解决SQLite数据库版本升级时的数据丢失问题?
A:在onUpgrade()方法中,可通过以下步骤实现数据迁移:
- 创建临时表存储旧数据(如
CREATE TABLE temp_user AS SELECT * FROM user); - 删除旧表(
DROP TABLE user); - 创建新表结构(调用
onCreate()或直接执行建表SQL); - 将临时表数据导入新表(
INSERT INTO user SELECT * FROM temp_user); - 删除临时表(
DROP TABLE temp_user)。
可使用Room框架的Migration类实现更灵活的数据迁移,避免手动编写SQL。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/50516.html