核心基石:使用 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()
是更健壮、更安全的选择。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复