问题标签 [android-room-prepackageddatabase]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
374 浏览

android - Room 库的 createFromAsset 和 fallbackToDestructiveMigration 方法 - 不存在数据

我在资产文件夹中有一个 .db 文件。我的 RoomDatabase 类如下。我将应用程序安装到我的设备上。然后我在下面的类中更改了 version = 2,并使我的预填充数据库版本为 2。然后我重命名了表中的一列,以便更改架构。然后我再次安装了该应用程序。和繁荣!Room 给我以下错误: Room 无法验证数据完整性。看起来您已更改架构但忘记更新版本号。您可以通过增加版本号来解决此问题。

在此之后,我完全删除了我的应用程序。制作预填充的数据库版本和@Database 版本 1。我在 AndroidManifest.xml 中将 allowBackup 设为 false。所以我的设备中不存在数据库。但是当我将应用程序安装到设备时,我仍然面临同样的错误。这是什么胡说八道的错误。我该如何解决?

0 投票
0 回答
58 浏览

android - 房间数据库关闭后如何重新打开

我想加密房间的现有数据库。为此,我使用 createFromAsset() 方法创建了数据库并将其关闭。加密后再次尝试重建数据库时,数据库内容为空。

即使省略加密,结果也是一样的。

您能告诉我关闭后如何重新打开数据库吗?

0 投票
1 回答
143 浏览

java - Android Studio 无法识别 createFromAsset()

我试图预填充我的房间数据库,但 Android Studio 说它“无法解析 'Builder' 中的方法 'createFromAsset()'。我使用的是房间版本 2.2.6,该功能是在版本 2.2.0 中实现的。

依赖项:

}

build.gradle (项目)

0 投票
2 回答
245 浏览

android - 更改架构时无法预填充房间数据库

我对一个我无法解决的问题束手无策 - 尝试更改数据库中表的架构/数据时。我正在使用 Rooms .createFromAsset 方法预先填充数据库。

当前模式和数据(工作) - 如 DB Browser 中所示 - 这是用于预填充应用程序数据库的数据库。 在此处输入图像描述

在此处输入图像描述

当我使用以下代码构建数据库时:

而这个数据类:

它成功地将数据库预填充到应用程序中:如 Database Explorer 所示: 在此处输入图像描述



问题是这样的:如果我尝试更改架构:添加列,删除列(通过更改 csv 文件并导入数据库浏览器中的新表来完成,然后重命名为 airport_table 并将一个添加到数据库版本),它不加载数据。

例如:(不预先填充):

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 除了我认为不相关的“E/libc:访问被拒绝找到属性“ro.serialno””之外,我没有收到任何错误。

此外 - 更改这张表意味着我的另一张表不会预先填充。但是空数据库仍然成功创建,我可以在应用程序中添加它。

请帮助我 - 我已经查看了堆栈溢出的类似问题。有些是相似的,但涉及到让任何事情发生——我的问题是它只适用于我在测试时碰巧成功的一个确切的模式——但我想要另一个模式。

非常感谢,利亚姆

0 投票
1 回答
133 浏览

android - 预填充的 Android Room 数据库保持为空

我正在使用 Room 版本 2.2.6.、Android Studio 4.2.2 并用 Java 编写。

我在模拟器中手动填充了我的应用程序的数据库,并与应用程序进行交互,它同时显示在应用程序和数据库检查器中,正如人们所期望的那样。我建立了一个特定的初始示例状态,我希望我的用户在第一次启动时就拥有它。然后我.db .db-shm .db-wal直接从设备文件资源管理器下载文件,并将它们保存在 src/main/assets/databases/ 中。

在我的数据库初始化代码中,我在and调用.createFromAsset("databases/Example.db")之间添加了行,以从这些文件中预填充我的数据库。.databaseBuilder.build

然而,在擦除我的本地数据并重新安装应用程序后,数据库仍然是空的。

任何线索我可以搜索什么方向?我在这里找到的所有与 createFromAsset 相关的帖子都只包含文档中相同的复制段落。

0 投票
1 回答
440 浏览

android - 更新应用程序时如何将新数据添加到android房间数据库?

我正在使用 Room 数据库制作一个 android 应用程序。

我的计划是在设备上安装时使用一些初始数据预填充数据库,

用户可以编辑它并在每个表上插入新行。

用户的新行 ID 将从例如 10000 开始,

(我的问题的重点),后来我想在最多 9999 的行中添加更多数据

当用户更新应用程序时我可以这样做吗?还是有其他方法?

也许我应该尝试将 csv 文件导入房间数据库

谢谢!!

我从应用资产预填充的代码

0 投票
1 回答
543 浏览

android - 带有更新的预填充数据库的 Android Room 迁移

我对 Room 和使用预填充数据库的迁移有点头疼。

解释

我目前正在使用 Room 和一个预填充的数据库。使用第一个版本(版本 1),数据库加载正常,一切正常。

问题是,此时我需要向数据库中添加三个新表,其中包含数据。所以我开始更新我拥有的版本 1 数据库,并创建了所有包含我需要的数据的表和行。

第一次尝试,我直接将新的.sqlite数据库推入assets文件夹并将版本号更改为2,但是Room当然给出了它需要知道如何处理迁移1_2的错误,所以我添加了一个迁移规则

认为如果我告诉 Room 创建这些表,它会连接到 assets 中的新数据库并相应地填充表。但这当然没有用,通过查看数据库检查器,很明显这些表是存在的,但它们是空的。

我不太喜欢的解决方案

最后经过一番修改后,我发现有用的是拥有更新数据库的副本,在其中导航(我目前正在使用 DB Browser for SQLite),获取新填充的行的 SQL 查询,并相应地格式化database.execSQL语句以将新数据插入表中:

对于我们正在处理包含小数据的行的情况,我发现这是一个“可接受的”解决方案,但在我的情况下,我正在处理具有很长字符串的行,这会带来一系列不便:

  • 从数据库数据中提取的 SQL 语句需要进行良好的格式化:'需要处理符号以及"可能出现在长字符串和换行符中的符号;
  • 需要保持数据库和行的插入语句之间的一致性;

问题

请注意,fallbackToDestructiveMigration() 不是一个可接受的选项,因为版本 1 中的数据库中包含用户创建的数据,并且需要在迁移之间保留。

那么,有没有一种解决方案可以让我直接将新的 .sqlite 数据库推送到资产中,而无需编写大量的 INSERT 和 CREATE TABLE 语句,并让 Room 自动处理其中的新数据,同时保留旧表数据?


感谢您的时间!

0 投票
1 回答
79 浏览

android-sqlite - Android Sqlite 不更新预填充的数据库

我在我的 android 应用程序中使用预填充的 sqlite 数据库。现在的问题是当我更新我的数据库中的数据并且我增加数据库版本onUpgrade()方法被调用但我的数据库没有更新时。任何帮助,将不胜感激。

这是我的 DatabaseHelper.java

这是我的DatabaseHandler.java

0 投票
1 回答
130 浏览

android - Android Room 将预打包的数据库存储在缓存中是否正常?

我目前正在创建一个使用预打包数据库的 Android 应用程序。该数据库最初大小约为 40MB,存储在 assets/databases 文件夹中。

问题
当我查看我的应用程序正在使用多少空间时,“应用程序信息”页面显示以下内容:

  • 应用程序大小:~25mb
  • 用户数据:~3mb
  • 缓存:~45mb


这是我所看到的截图

我认为 ROOM 造成这种情况的原因如下:

  1. 我没有在我的应用程序中缓存任何内容(使用设备文件资源管理器进行了双重检查)。
  2. 当我从 SQLiteOpenHelper 迁移到 Room 时,这个问题开始发生
  3. 数据库的大小比App Size大得多,但它与Cache大小大致相同,因此存储为Cache的任何内容都必须与数据库相关。
  4. 每当我从我的实体中添加/删除索引时,缓存大小都会发生变化。
  5. 当我清除缓存并打开应用程序时,缓存大小恢复到 ~45mb。

Android ROOM 将预打包的数据库存储为Cache是否正常?任何帮助将不胜感激,如果您需要更多信息,请告诉我。

谢谢

编辑(附加信息)
这是我在设备文件资源管理器中看到的

设备文件资源管理器

这就是我实现 Room 数据库的方式

0 投票
1 回答
43 浏览

android - 带有预填充数据库的房间

在我的应用程序中,我正在使用带有预填充数据库的 Room,myDatabase.db然后使用以下代码访问该数据库:

该文件myDatabase.db存储在 /assets/ 文件夹中。然后我不得不在这样的数据库中的表上添加一些新行。之后,我得到了一个更新的myDatabase.db文件,我将它复制到 /assets/ 文件夹中替换了旧文件。问题来了:安装应用程序后,它仍然使用旧数据。我做了一些搜索,但只找到了与迁移相关的结果。但是,就我而言,表的架构没有变化,只是添加了一些新行。此外,我不明白为什么该应用程序不选择新myDatabase.db文件并仍然使用旧文件。

让应用程序使用新文件的唯一解决方案myDatabase.db是卸载应用程序,然后重新安装,但这是我想避免的。那么,如何更改myDatabase.dbassets 文件夹中的文件并让应用程序通过 Room 选择新文件中的数据?