在安卓应用开发中,数据持久化是至关重要的一环,SQLite作为一款轻量级、嵌入式的关系型数据库,因其无需服务器、资源占用低、事务处理能力强等优点,成为了安卓平台本地数据存储的首选方案,掌握如何在安卓中创建和管理SQLite数据库,是每一位安卓开发者的必备技能。
核心类:SQLiteOpenHelper
安卓SDK提供了一个非常方便的辅助类——SQLiteOpenHelper
,用于管理数据库的创建和版本管理,开发者无需直接编写复杂的SQL语句来处理数据库的创建和升级,只需继承这个类并重写其关键方法即可。SQLiteOpenHelper
主要扮演一个“管家”的角色,它会在需要时自动创建数据库,并在应用更新时根据版本号智能地升级数据库结构。
创建数据库的详细步骤
创建一个SQLite数据库通常遵循以下四个核心步骤,我们将通过一个创建用户信息表的实例来详细说明。
第一步:创建自定义辅助类
创建一个新的Java类,并让它继承自SQLiteOpenHelper
,这个类将封装所有与数据库相关的操作。
public class MyDatabaseHelper extends SQLiteOpenHelper { // 构造函数 public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } // 创建数据库时调用 @Override public void onCreate(SQLiteDatabase db) { // 在这里编写创建表的SQL语句 } // 升级数据库时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 在这里编写升级数据库的SQL语句 } }
第二步:实现构造函数
构造函数是连接应用与数据库的桥梁,我们会简化构造函数,只保留必要的参数。
public static final String DATABASE_NAME = "user_info.db"; public static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
这里,我们定义了数据库名称(user_info.db
)和版本号(1
)。Context
是访问应用资源的入口,null
表示使用默认的游标工厂,版本号用于后续的数据库升级。
第三步:重写onCreate()方法
onCreate()
方法会在数据库文件首次被创建时调用,且只会调用一次,这是执行CREATE TABLE
语句的最佳位置。
@Override public void onCreate(SQLiteDatabase db) { String CREATE_USER_TABLE = "CREATE TABLE users (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "age INTEGER," + "email TEXT UNIQUE" + ")"; db.execSQL(CREATE_USER_TABLE); }
这段SQL语句创建了一个名为users
的表,包含id
(主键,自增)、name
(文本,非空)、age
(整数)和email
(文本,唯一)四个字段。db.execSQL()
用于执行不返回结果的SQL语句。
第四步:重写onUpgrade()方法
当应用更新,数据库版本号(DATABASE_VERSION
)增加时,onUpgrade()
方法会被触发,开发者可以在这里执行表结构的修改、数据迁移等操作。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 简单粗暴的升级方式:删除旧表,重新创建 db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); }
这个示例展示了一种常见的升级策略:先删除旧表,然后调用onCreate()
重新创建新表,在生产环境中,可能需要更复杂的逻辑来保留旧数据。
如何使用数据库
完成辅助类的创建后,就可以在Activity或其他组件中使用了。
// 在Activity中 MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); // 获取可写的数据库对象(如果数据库不存在,会自动创建) SQLiteDatabase db = dbHelper.getWritableDatabase(); // 执行插入操作 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("users", null, values); // 关闭数据库连接 db.close();
调用getWritableDatabase()
或getReadableDatabase()
时,如果数据库文件不存在,SQLiteOpenHelper
会自动调用onCreate()
来创建它。
为了更清晰地理解,下表小编总结了SQLiteOpenHelper
的核心方法:
方法名 | 调用时机 | 主要用途 |
---|---|---|
onCreate() | 数据库首次创建时 | 执行创建表和初始化数据的SQL语句。 |
onUpgrade() | 数据库版本号增加时 | 执行修改表结构、添加新表或数据迁移等操作。 |
getWritableDatabase() | 需要读写数据时 | 获取一个可读写的SQLiteDatabase 实例,会触发数据库的创建或打开。 |
getReadableDatabase() | 只需要读取数据时 | 获取一个可读的SQLiteDatabase 实例,在磁盘空间不足时可能返回只读数据库。 |
相关问答 (FAQs)
问题1:onCreate()
和 onUpgrade()
方法有什么区别?它们分别在什么时候被调用?
解答: onCreate()
和onUpgrade()
是SQLiteOpenHelper
中用于数据库生命周期管理的两个核心回调方法,但它们的触发场景完全不同。
onCreate(SQLiteDatabase db)
:仅在数据库文件不存在并首次被创建时调用,它负责执行数据库的初始化工作,比如创建所有需要的表,一旦数据库创建成功,这个方法在应用的整个生命周期中(除非手动删除数据库文件)将不会再被调用。:在已存在的数据库的版本号(即构造函数中传入的版本号)比当前存储的版本号高时调用,它主要用于处理应用更新时的数据库结构变更,例如添加新字段、创建新表或删除旧表,开发者可以根据 oldVersion
和newVersion
来编写增量升级逻辑,以兼容不同版本的用户。
问题2:创建的数据库文件存储在手机的什么位置?我可以在文件管理器中看到它吗?
解答: 默认情况下,通过SQLiteOpenHelper
创建的数据库文件存储在应用的私有目录中,具体路径为:/data/data/<你的应用包名>/databases/
,如果应用的包名是com.example.myapp
,数据库文件就在/data/data/com.example.myapp/databases/
目录下。
这个目录是应用私有的,意味着:
- 默认情况下,用户和其他应用无法直接访问,这保证了数据的安全性。
- 你无法在手机的普通文件管理器中看到这个文件夹,因为它受到了系统权限保护。
- 如果你想查看或管理这个数据库文件,需要借助Android Studio的“Device File Explorer”工具(需要Root权限或使用模拟器),或者在已Root的设备上使用具有Root权限的文件管理器,在开发阶段,使用Android Studio的Device File Explorer是最方便的方式。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复