You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中用ROOM(Java)导入本地.sql数据库

在Android Studio中用Room(Java)预填充现有SQL数据库

第一步:将.sql文件转换为.db文件

这是预填充的基础,提供两种可靠方法:

  • 可视化工具法(SQLiteStudio)
    1. 下载并打开SQLiteStudio,新建一个空的.db数据库文件(命名要和后续Room配置一致,比如mydatabase.db)
    2. 右键该数据库,选择「Execute SQL script」,选中你的.sql文件执行
    3. 执行完成后,这个.db文件就是包含所有数据的SQLite数据库
  • 命令行法
    打开终端执行以下命令(需确保本地安装了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:15:34