上一篇
安卓开发打开数据库的方法
- 行业动态
- 2025-04-21
- 3189
安卓开发中打开数据库的实现方法
通过 SQLiteOpenHelper
创建与打开数据库
安卓推荐使用 SQLiteOpenHelper
辅助类管理数据库,其核心逻辑包括:
- 定义数据库结构:指定数据库名称、版本号。
- 创建/升级数据库:通过重写
onCreate()
和onUpgrade()
方法。 - 获取数据库实例:调用
getReadableDatabase()
或getWritableDatabase()
。
代码示例:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; // 数据库名称 private static final int DATABASE_VERSION = 1; // 版本号 // 构造函数(建议用单例模式) public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // 首次创建数据库时调用 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } // 数据库版本升级时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
打开数据库:
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 可读写(支持增删改) // 或 SQLiteDatabase db = dbHelper.getReadableDatabase(); // 只读(查询)
关键方法对比
方法 | 作用 | 适用场景 |
---|---|---|
getReadableDatabase | 获取只读数据库实例 | 仅执行查询操作 |
getWritableDatabase | 获取可读写数据库实例 | 增删改操作 |
close() | 关闭数据库连接 | Activity/Fragment销毁时 |
注意事项
单例模式:避免多次创建
SQLiteOpenHelper
实例,导致资源浪费。private static MyDatabaseHelper instance; public static MyDatabaseHelper getInstance(Context context) { if (instance == null) { instance = new MyDatabaseHelper(context.getApplicationContext()); } return instance; }
线程安全:数据库操作需在子线程执行,UI线程直接操作会抛出异常。
new Thread(() -> { SQLiteDatabase db = dbHelper.getWritableDatabase(); // 执行CRUD操作 db.close(); }).start();
生命周期管理:确保在
onDestroy()
中关闭数据库,防止内存泄漏。@Override protected void onDestroy() { super.onDestroy(); dbHelper.close(); }
常见问题与解决方案
问题 | 解决方案 |
---|---|
数据库表未创建 | 确保调用了 getWritableDatabase() 或 getReadableDatabase() 触发 onCreate() |
多线程冲突 | 使用事务(beginTransaction() )或同步锁(synchronized )保证操作原子性 |
版本升级失败 | 在 onUpgrade() 中处理数据迁移逻辑(如备份旧表、修改表结构) |
相关问题与解答
问题1:如何实现数据库版本升级?
解答:
在 onUpgrade()
方法中处理数据迁移逻辑。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER"); // 新增字段 } }
问题2:如何在多线程中安全操作数据库?
解答:
- 事务管理:使用
db.beginTransaction()
和db.setTransactionSuccessful()
确保操作原子性。 - 同步锁:对数据库操作代码块添加
synchronized
关键字,避免并发冲突