核心基石:使用 SQLiteOpenHelper 创建数据库
在安卓开发中,我们不推荐直接使用原始的SQL语句来创建数据库文件,官方推荐的最佳实践是继承 SQLiteOpenHelper 抽象类,这个类封装了数据库创建和升级的复杂逻辑,让开发者能够更加安全和便捷地管理数据库。

SQLiteOpenHelper 主要有两个需要我们重写的关键方法:
:当数据库文件首次被创建时,系统会调用这个方法,这是我们执行建表语句( CREATE TABLE)和初始化数据的理想场所,该方法只会在数据库不存在时执行一次。:当数据库需要升级时(应用版本更新,表结构发生变化),系统会调用此方法,开发者可以在这里执行 ALTER TABLE、DROP TABLE等操作来更新数据库结构。
创建一个示例数据库
假设我们要创建一个用于存储用户信息的数据库,其中包含一个名为 users 的表,该表有 id(主键)、name 和 email 三个字段。
创建一个继承自 SQLiteOpenHelper 的类,DatabaseHelper.java:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
// 数据库名称
private static final String DATABASE_NAME = "UserDatabase.db";
// 数据库版本,每次升级数据库时需要增加此值
private static final int DATABASE_VERSION = 1;
// 创建 users 表的 SQL 语句
private static final String CREATE_TABLE_USERS = "CREATE TABLE users (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT NOT NULL," +
"email TEXT UNIQUE" +
")";
// 构造函数
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 当数据库首次创建时,执行建表语句
db.execSQL(CREATE_TABLE_USERS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 简单的升级策略:删除旧表并重新创建
// 在生产环境中,这里应该有更复杂的逻辑来迁移数据
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
} 通过上述代码,我们就定义了一个数据库助手类,当这个类的实例被首次调用以获取数据库时,安卓系统会自动在应用的私有存储空间内创建一个名为 UserDatabase.db 的文件,并执行 onCreate 方法中的建表逻辑。
打开数据库:获取可读写对象
创建了 DatabaseHelper 之后,我们如何“打开”数据库并对其进行操作呢?SQLiteOpenHelper 已经为我们处理了这一切,我们只需要通过它的实例来获取一个 SQLiteDatabase 对象,这个对象就代表了已经打开的数据库连接。
SQLiteOpenHelper 提供了两个关键方法来获取 SQLiteDatabase 对象:
getWritableDatabase():以可读可写模式打开数据库,如果磁盘空间已满或数据库本身被锁定无法写入,它会抛出异常,这是最常用的方法,适用于需要增、删、改操作的场景。getReadableDatabase():以可读模式打开数据库,如果数据库不可写(磁盘已满),它会返回一个只读的数据库对象,而不会抛出异常,当你的操作只涉及查询时,使用此方法更为安全。
使用示例
在你的 Activity 或其他组件中,可以这样使用:

// 在 Activity 中
DatabaseHelper dbHelper = new DatabaseHelper(this);
// 获取可写的数据库对象,用于执行增、删、改、查操作
SQLiteDatabase db = dbHelper.getWritableDatabase();
// ... 执行你的数据库操作,例如插入数据 ...
// ContentValues values = new ContentValues();
// values.put("name", "张三");
// values.put("email", "zhangsan@example.com");
// db.insert("users", null, values);
// 操作完成后,关闭数据库连接,释放资源
db.close(); 调用 getWritableDatabase() 时,UserDatabase.db 文件不存在,系统会先调用 DatabaseHelper 的 onCreate 方法创建它,然后再返回一个可写的数据库对象,如果文件已存在,则直接打开它。
数据库文件的位置与查看
了解了如何在代码中创建和打开数据库,一个很自然的问题就是:这个数据库文件到底存储在手机的哪个位置?我如何能看到它的真实内容?
文件位置
安卓应用的数据库文件存储在应用的私有目录下,外部应用(包括用户)默认是无法访问的,其标准路径为:
/data/data/<你的应用包名>/databases/<数据库名>.db
包名为 com.example.myapp,数据库名为 UserDatabase.db,那么它的完整路径就是 /data/data/com.example.myapp/databases/UserDatabase.db。
如何打开和查看数据库文件?
由于权限限制,你不能用普通的文件管理器直接打开这个目录,但在开发和调试阶段,我们有多种方式可以查看和管理数据库文件。
| 工具/方法 | 平台 | 使用说明 | 优点 |
|---|---|---|---|
| Android Studio 设备文件浏览器 | 开发电脑 | 在 Android Studio 的 “Device File Explorer” 面板中,导航到 /data/data/<包名>/databases/ 目录即可看到 .db 文件,可以将其保存到电脑上。 | 集成在IDE中,非常方便,无需额外命令。 |
| ADB Shell | 开发电脑 | 使用命令行工具 adb,通过 adb shell 进入设备,再使用 sqlite3 <数据库文件路径> 命令进入数据库命令行进行交互。 | 功能强大,适合习惯命令行的开发者,可执行任何SQL语句。 |
| 第三方数据库查看器 | 开发电脑/安卓设备 | 如 “DB Browser for SQLite”(PC端软件)或 “Stetho”(Facebook出品的调试工具,可在Chrome浏览器中查看)。 | 图形化界面,直观易用,支持数据可视化编辑。 |
使用 Android Studio 查看数据库的简要步骤:

- 连接你的安卓设备或启动模拟器。
- 在 Android Studio 底部工具栏找到
Device File Explorer。 - 在文件树中依次展开
data -> data -> <你的应用包名> -> databases。 - 你会看到
UserDatabase.db文件,右键点击选择Save As...即可将其导出到电脑上。 - 使用 “DB Browser for SQLite” 等工具打开这个导出的文件,就可以直观地查看表结构和数据了。
相关问答 FAQs
Q1: 我可以在没有 root 的手机上直接用文件管理器 App 打开或查看我应用的数据库文件吗?
A: 不可以,出于安全考虑,安卓系统将每个应用的内部存储(包括 /data/data/ 目录)设置为私有,只有应用本身或者拥有 root 权限的系统才能访问这个目录,普通文件管理器 App 没有权限进入并查看其他应用的数据,查看数据库必须通过上述的开发调试工具(如 Android Studio Device File Explorer 或 ADB)来实现。
Q2: getWritableDatabase() 和 getReadableDatabase() 的区别仅仅是“可写”与“只读”吗?
A: 不完全如此,虽然字面意思是可写和只读,但它们的实际行为更微妙。getWritableDatabase() 会尽最大努力以读写模式打开数据库,如果失败(如磁盘满)会抛出 SQLiteException,而 getReadableDatabase() 会首先尝试以读写模式打开,如果失败,它会降级尝试以只读模式打开,并成功返回一个只读的数据库对象,不会导致应用崩溃,当你确定只需要查询数据时,使用 getReadableDatabase() 是更健壮、更安全的选择。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复