首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过从assert复制数据库文件在Room中使用预先填充的数据库

通过从assert复制数据库文件在Room中使用预先填充的数据库
EN

Stack Overflow用户
提问于 2018-08-16 09:31:44
回答 4查看 3.8K关注 0票数 3

我想使用安卓机房的预置数据库。我找到了一种方法,通过使用回调,并填充数据库文件。但是有些地方不对劲,我确信数据库是正常复制的,但是在设备监视器和android仿真器中它仍然是空的。你能帮帮我吗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
private static final String DB_NAME = "base.db";
static Context ctx;

public abstract Dao dao();

public static AppDatabase getDatabase(Context context) {
    if (INSTANCE == null) {
        ctx = context;
        synchronized (AppDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context,
                        AppDatabase.class, DB_NAME)
                        .allowMainThreadQueries()
                        .addCallback(rdc)
                        .build();
            }
        }
    }
    return INSTANCE;
}

private static RoomDatabase.Callback rdc = new RoomDatabase.Callback() {
    public void onCreate(SupportSQLiteDatabase db) {

        new PopulateDbAsync(INSTANCE, ctx).execute();
        Log.d("db create ", "table created when db created first time in  onCreate");
    }

    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        ContentValues contentValues = new ContentValues();
    }
};

private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {

    private Dao dao;
    AssetManager assetManager = ctx.getAssets();

    PopulateDbAsync(AppDatabase db, Context context) {
        Dao = db.Dao();
        ctx = context;
    }

    @Override
    protected Void doInBackground(final Void... params) {
        String DB_PATH = "/data/data/mypackage/databases/";
        String DB_NAME = "base.db";
        try {
            Log.d("AppDatabase","Trying copy database file");
            OutputStream myOutput = new FileOutputStream(DB_PATH + DB_NAME);
            byte[] buffer = new byte[1024];
            int length;
            InputStream myInput = ctx.getAssets().open("base.db");
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            myInput.close();
            myOutput.flush();
            myOutput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-06 06:40:53

我花了6个小时在研究和研发上解决了问题。

上下文是:-我想把已经存在的finaldb.db(它在assests文件夹中)放到房间数据库中。

步骤1 :从这里复制这个框架文件链接

步骤2:需要迁移的,我有代码:)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Database(entities = {Status.class}, version = 1,exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    public abstract DataDao StatusDao();

    private static AppDatabase INSTANCE;


    public static AppDatabase getDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = createDatabase(context);
        }
        return (INSTANCE);
    }

    private static final Migration MIGRATION_2_3 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            Log.d("kkkk","bc");

            String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS 'Status' " +
                    "( 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
                    "  'category' TEXT NOT NULL," +
                    "  'sub_category' TEXT NOT NULL," +
                    "  'content' TEXT NOT NULL," +
                    "  'favourite' INTEGER DEFAULT(0))";

            database.execSQL(SQL_CREATE_TABLE);

        }
    };

    private static AppDatabase createDatabase(Context context) {
        RoomDatabase.Builder<AppDatabase> builder =
                Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class,
                        context.getString(R.string.dbase_name));


        return (builder.openHelperFactory(new AssetSQLiteOpenHelperFactory())
                .allowMainThreadQueries()
                .addMigrations(MIGRATION_2_3)
                .build());
    }

}

在MIGRATION_2_3中,您必须创建与当前数据库完全相同的表(该数据库存在于资产文件夹中)

想了解迁移

步骤3:在房间数据库中成功地创建了 Now表!

如果发生崩溃,请参阅您的logcat,其中以可理解的形式写成.。

票数 5
EN

Stack Overflow用户

发布于 2018-08-16 12:30:03

您不能正确地在onCreate方法中复制数据库。

当调用onCreate方法时,已经创建了数据库(将创建的数据库传递给该方法)。您必须在onCreate方法之前和数据库打开之前进行复制。

您可以重写init方法的RoomDatabase,并从该方法执行副本,或者在调用databaseBuilder之前执行复制。

票数 2
EN

Stack Overflow用户

发布于 2018-09-04 01:20:49

我解决了。数据库类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Database(entities = {Entity1.class, Entity2.class, Entity3.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;

public abstract Entity1Dao 1Dao();
public abstract Entity2Dao 2Dao();
public abstract Entity3Dao 3Dao();

public static AppDatabase getDatabase(Context context) {
    if (INSTANCE == null) {
        INSTANCE = createDatabase(context);
    }
    return (INSTANCE);
}

  private static AppDatabase createDatabase(Context context) {
    RoomDatabase.Builder<AppDatabase> builder =
            Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class,
                    context.getString(R.string.dbase_name));
    return (builder.openHelperFactory(new AssetSQLiteOpenHelperFactory())
            .allowMainThreadQueries()
            .build());
  }
}

此外,您还应该获得SQL帮助程序,链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51882500

复制
相关文章
【Jetpack】Room 预填充数据 ( 安装 DB Browser for SQLite 工具 | 创建数据库文件 | 应用中设预填充数据对应的数据库文件 | 预填充数据库表字段属性必须一致 )
在 Android 中使用 Room 框架 , 创建 SQLite 数据库时 , 有时需要预填充一些数据 , 这些数据一般都是来自 assets 资源目录 ;
韩曙亮
2023/10/11
6340
【Jetpack】Room 预填充数据 ( 安装 DB Browser for SQLite 工具 | 创建数据库文件 | 应用中设预填充数据对应的数据库文件 | 预填充数据库表字段属性必须一致 )
python中assert的使用
   在python程序中,如果想要确保程序中的某个条件一定为真才会继续执行的话,而可以使用assert来实现。
py3study
2020/01/13
7090
Room 中的数据库关系
设计一个关系型数据库很重要的一部分是将数据拆分成具有相关关系的数据表,然后将数据以符合这种关系的逻辑方式整合到一起。从 Room 2.2 的稳定版开始,我们可利用一个 @Relation 注解来支持表之间所有可能出现的关系: 一对一、一对多和多对多。
Android 开发者
2020/03/09
2.2K0
Room 中的数据库关系
Android Room数据库使用
  Room数据库是Google的JitPack组件中的一个,推出已经有一段时间了,现在的使用者也越来越多,Room是一个轻量级的ORM(Object Relational Mapping:对象关系映射)数据库。本质上就是对Android原生的SQLite的封装,只不过使用起来比原生简单,就好像一些开源库GreenDao、LitePal、OrmLite等,都是对Android SQLite的再次封装。
晨曦_LLW
2021/12/30
1.3K0
Android Room数据库使用
Android Room数据库使用
  Room数据库是Google的JitPack组件中的一个,推出已经有一段时间了,现在的使用者也越来越多,Room是一个轻量级的ORM(Object Relational Mapping:对象关系映射)数据库。本质上就是对Android原生的SQLite的封装,只不过使用起来比原生简单,就好像一些开源库GreenDao、LitePal、OrmLite等,都是对Android SQLite的再次封装。
晨曦_LLW
2021/08/25
7370
实战 | 在 Room 中使用 Flow
Jetpack Room 对协程的支持越来越丰富: Room 2.1 版本增加了对协程的支持,并加入了一次性 (one-shot) 的读写操作,Room 2.2 我们通过 Flow 为读操作加入了可观察性,当数据库中的数据有变化时它可以使您收到通知。
Android 开发者
2022/09/23
5290
实战 | 在 Room 中使用 Flow
在Python中正确的使用断言-assert
最近这两天流感频发,小伙伴们可要注意预防感冒,多锻炼身体。当一个人生病时就会觉得健康是一种莫大的幸福,主要是我中招了,感冒好了之后,我决定继续坚持锻炼身体。今天继续分享Python 的小碎碎 assert。
somenzz
2020/11/25
1.7K0
Android的room数据库使用小结(kotlin)
Room是Google官方推荐使用的数据库,相比较某些优秀数据库框架来说,不用过于担心某天库会停止维护,且访问数据库非常流畅,并且提供了与常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,譬如@Database、@Dao、@Entity、@Query、@Insert、@Update、@Detele等的注解,可以使用简单代码实现相比以前SQLite更复杂的代码的效果,这点儿有点儿类似于java世界里的mybatis。总而言之, Room功能强大,速度和稳定性不弱,还简单易用,算得上是一个优秀的数据库。
杨永贞
2021/06/02
3.3K0
Android的room数据库使用小结(kotlin)
在ORACLE中移动数据库文件
在ORACLE中移动数据库文件 --ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。 --由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等, --我們可能会考虑移动数据库文件。 --下面以LUNIX平台为例,分别讨论三种数据库文件的移动方法。 一.移动数据文件: -- 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件。 1. ALTER DATABASE方法; -- 用此方法,可以移动任何表空间的数据文件。 STEP 1. 下数据
阿新
2018/04/12
1.3K0
Room 中的数据库自动迁移功能
自 2.4.0-alpha01 版本开始,Room 库里新加入了自动迁移的功能,这让数据库迁移的实现变得更简单。以往每当您的数据库 schema 发生变化时,您都必须实现一个 Migration 类,并将实际变化告知 Room,且多数情况下均涉及编写和执行复杂的 SQL 查询。
Android 开发者
2022/03/09
1.4K0
垂直电镀通孔填充。
对于热容量较大的PCB,例如多层板或厚铜板,适当且一致的填孔是一个挑战。重要的是要确保这些不可见的缺陷不会成为漏网之鱼,同时还要确保采用适当的返工技术,正确填充这些电镀孔。
高拓电子
2022/08/22
5050
[Oracle ASM全解析] 使用SQL*Plus创建数据库文件
一般来说我们推荐使用DBCA来创建数据库,当我们需要手动命令创建的时候可以指定使用ASM,下面的语句创建一个数据库
bsbforever
2020/08/19
1.9K0
数据库文件的迁移
关于数据库中的文件迁移,需要考虑普通数据文件,redo日志文件(还需要考虑是否为current状态),undo表空间,临时表空间,system,sysaux表空间。 文件迁移可以参考下面的伪代码: move_non_system_tablespace ,需要在open状态 { alter tablespace xxxx offline; cp datafiles
jeanron100
2018/03/13
2.5K0
Jetpack Room使用
数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问
北洋
2022/05/10
3520
python中的断言 (assert)
断言(assert)是python中的常用用法之一,主要用于判断一个条件,当条件为假的时候会触发一个AssertionError。即:
生信编程日常
2020/05/29
1.7K0
Jetpack组件之Room
Android使用SQLite作为数据库存储数据,但是SQLite使用繁琐且容易出错,有许多开源的数据如GreenDAO、ORMLite等,这些都是为了方便SQLite的使用而出现的,Google也意识到了这个问题,在Jetpack组件中推出了Room,Room在SQLite上提供了一层封装,可以流畅的访问数据库。
八归少年
2022/06/29
1.9K0
Jetpack组件之Room
JetPack--Room数据库
定义一个实体类,在class上使用 @Entity注解 ,还需要一个构造方法,Room会根据这个构造将表里的数据转化为实体类,对于其他我们代码里使用的构造方法,可以使用@Ignore注解表示Room将忽略它,属性也可以使用这个注解,表示这个属性将不会生成数据库字段 使用@PrimaryKey注解指定主键并且是自增长的 属性还可以指定在数据库的字段等,使用@ColumnInfo注解:
aruba
2021/12/06
1.5K0
JetPack--Room数据库
Mysql数据库文件夹复制出错,你遇到过吗?
今天我的一个同学在家做了一个作品,建立了mysql数据库,来学校的时候从家里的wamp文件夹里面拷贝了data下的mysql数据库文件夹,结果到学校不能使用了。百度之后发现一种“MyISAM”类型的表可以直接复制,而innodb类型的不可以。。。。 现在正在恢复。。。未完待续 后来留着 frm 文件不要动、在新的mysql里建一个数据库,然后分别手工建立你要的那些表,结构随便弄.这样在 Mysql\data文件夹就有了一堆和你手头保存的frm对应文件.把你保留的文件覆盖这些新的frm ,特别是那个 db.o
苦咖啡
2018/05/07
3K0
pytest的assert_assert中文
断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试 failed
全栈程序员站长
2022/09/16
6130
点击加载更多

相似问题

通过从文档复制.sqlite文件预先填充核心数据

10

从预先填充的数据库文件中读取数据

11

如何创建预先填充的SQLite数据库文件?

13

如何使用字符串数组预先填充Room数据库

21

使用Hilt预先填充Room数据库,而无需创建额外的数据库实例

2127
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文