如何在Android Studio中用ROOM(Java)导入本地.sql数据库
在Android Studio中用Room(Java)预填充现有SQL数据库
第一步:将.sql文件转换为.db文件
这是预填充的基础,提供两种可靠方法:
- 可视化工具法(SQLiteStudio)
- 下载并打开SQLiteStudio,新建一个空的
.db数据库文件(命名要和后续Room配置一致,比如mydatabase.db) - 右键该数据库,选择「Execute SQL script」,选中你的
.sql文件执行 - 执行完成后,这个
.db文件就是包含所有数据的SQLite数据库
- 下载并打开SQLiteStudio,新建一个空的
- 命令行法
打开终端执行以下命令(需确保本地安装了SQLite):
执行后会生成对应sqlite3 mydatabase.db < your_sql_file.sql.db文件
提示:如果.sql文件来自MySQL等其他数据库,需先修正SQLite不兼容的语法,比如将AUTO_INCREMENT替换为AUTOINCREMENT,移除SQLite不支持的约束或函数
第二步:将.db文件放入项目assets目录
- 在Android项目的
main目录下新建assets文件夹(无则创建) - 把生成的
.db文件复制到assets目录内
注意:assets里的.db文件名必须和后续Room配置的数据库名称完全一致
第三步:Room配置(Java实现)
1. 添加Room依赖
在模块级build.gradle的dependencies块中加入:
implementation "androidx.room:room-runtime:2.6.1" annotationProcessor "androidx.room:room-compiler:2.6.1"
2. 编写Room Database类,实现预填充逻辑
核心是通过Room的Callback,在数据库首次创建时将assets中的.db文件复制到Room的默认存储路径:
import android.content.Context; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // 替换为你的实体类和DAO接口 @Database(entities = {YourEntity.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract YourDao yourDao(); private static AppDatabase INSTANCE; private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(); public static AppDatabase getInstance(final Context context) { if (INSTANCE == null) { synchronized (AppDatabase.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "mydatabase.db") .addCallback(new Callback() { @Override public void onCreate(SupportSQLiteDatabase db) { super.onCreate(db); // 用单线程池执行文件复制,避免阻塞主线程 EXECUTOR.execute(() -> copyDatabase(context)); } }) .build(); } } } return INSTANCE; } private static void copyDatabase(Context context) { try { InputStream inputStream = context.getAssets().open("mydatabase.db"); String dbPath = context.getDatabasePath("mydatabase.db").getPath(); File dbFile = new File(dbPath); OutputStream outputStream = new FileOutputStream(dbFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } outputStream.flush(); outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
3. 关键注意事项
@Database注解中的数据库名称必须和assets里的.db文件名完全匹配- 正式环境不要使用
allowMainThreadQueries(),示例中用ExecutorService处理异步操作,符合Android性能规范 - 测试时需先卸载旧应用,确保首次创建数据库的逻辑触发
- 后续数据库升级需添加
Migration类,避免覆盖预填充数据
内容的提问来源于stack exchange,提问作者Otto
相关产品推荐
相关产品推荐

