确认数据库格式
.db
格式的 SQLite 文件。放置数据库文件
.db
文件放入项目的 assets
目录或 res/raw
目录。 src/main/assets/
(无需编译为资源文件)。以下代码演示如何将 assets
中的数据库文件复制到应用私有目录并加载。
// 1. 定义数据库工具类 public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "your_database.db"; // 数据库名称 private static final int DATABASE_VERSION = 1; // 版本号 private Context context; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.context = context; } // 2. 重写 onCreate() 方法(仅首次创建时调用) @Override public void onCreate(SQLiteDatabase db) { // 如果数据库不存在,则从 assets 中复制 copyDatabaseFromAssets(); } // 3. 重写 onUpgrade() 方法(可选) @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 实现数据库升级逻辑(如版本更新) } // 4. 复制数据库文件 private void copyDatabaseFromAssets() { String databasePath = context.getDatabasePath(DATABASE_NAME).getPath(); // 检查数据库是否已存在 if (new File(databasePath).exists()) { return; // 已存在则跳过复制 } try (InputStream is = context.getAssets().open(DATABASE_NAME); OutputStream os = new FileOutputStream(databasePath)) { byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { os.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } } }
步骤 | 关键点 | 注意事项 |
---|---|---|
文件存放位置 | 将 .db 文件放入 assets 或 res/raw |
res/raw 会被编译为资源文件,修改后需重新打包;assets 更灵活 |
数据库路径 | /data/data/<包名>/databases/ |
应用私有目录,无需申请存储权限 |
覆盖已有数据库 | 检查 databasePath 是否存在,避免重复复制 |
若需更新数据库,需手动删除旧文件或修改版本号触发 onUpgrade() |
异常处理 | 捕获 IOException ,确保流关闭 |
未关闭流可能导致内存泄漏或文件损坏 |
数据库兼容性 | 确保导入的数据库结构与代码中的 SQLiteOpenHelper 一致 |
表名、字段类型需匹配,否则会抛出异常 |
检查数据库是否复制成功
SELECT FROM table_name
。Device File Explorer
查看 /data/data/<包名>/databases/
目录。处理数据库升级
onUpgrade()
中执行 ALTER TABLE
或迁移逻辑。@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 添加新表或字段 db.execSQL("ALTER TABLE table_name ADD COLUMN new_column TEXT"); }
解答:
DatabaseHelper
中增加 DATABASE_VERSION
。 onUpgrade()
中编写 SQL 语句(如 ALTER TABLE
)。 解答:
// 假设使用 AES 解密 Cipher cipher = ... // 初始化解密器 try (InputStream is = context.getAssets().open("encrypted.db"); CipherInputStream cis = new CipherInputStream(is, cipher); OutputStream os = new FileOutputStream(databasePath)) { // 解密并复制数据 } catch (Exception e) { e.printStackTrace(); }