预打包数据库存在无效架构错误

2024-01-28

我正在基于旧的 Android 项目构建 Android 应用程序。 在我的新应用程序中,我使用 Room。我必须使用第一个项目中使用的相同数据库。 此外,我使用 com.amitshekhar.android:debug-db 库从第一个项目中提取了数据库。 获得数据库文件后,我想用 Room 打开它。

我正在像这样建立数据库:

Room.databaseBuilder(
            androidContext(),
            Database::class.java, "database.db"
        ).createFromAsset("database.db")
            .build()

目前我正在使用这个 createFromAsset() 方法,尽管稍后我将使用 createFromFile() 方法,因为我的数据库应该从服务器下载。

但我收到 java.lang.IllegalStateException: 预打包数据库具有无效架构 发生这种情况是因为 Room 不支持数据库中的多种数据类型,例如 NVARCHAR(200)、DATE 或 bit。

我知道 Room 仅使用五种 Sql 类型,但我不知道如何更改它以便 Room 可以使用上述方法打开此类数据库。

问题是如何将 NVARCHAR(200)、DATE 或 bit 转换为 Room 支持的数据类型?


您必须将数据库转换为使用 Room 支持且与实体匹配的特定列类型关联性。

For NVARCHAR(200)你需要有TEXT将 NVARCHAR(200) 替换为将该列定义为字符串的实体。

For DATE如果您使用基于字符串的日期,则取决于实体定义,例如YYYY-MM-DD hh:mm:ss 那么实体应该是字符串并且列亲和力TEXT。如果将日期存储为时间戳,则实体应该很长并且列亲和力INTEGER.

答案在这里无法将表迁移到 Room,因为布尔值在 Sqlite 中保存的方式出现错误 https://stackoverflow.com/questions/56193992/cant-migrate-a-table-to-room-do-to-an-error-with-the-way-booleans-are-saved-in/56194741#56194741进行转换以将 BOOL 更改为 INTEGER。

您可以对此进行调整(尽管我对 DATE 持谨慎态度)以适应。

额外的

您可能会发现以下内容很有用。您可以在您最喜欢的 SQLite 管理器工具中针对预先存在的数据库运行它。

WITH potentialRoomChanges AS (
    SELECT sm.name AS tablename, pti.name AS columnname, pti.type, dflt_value, pk,
        CASE 
            WHEN instr(upper(pti.type),'INT') THEN 'INTEGER'
            WHEN instr(upper(pti.type),'CHAR') OR instr(upper(pti.type),'CLOB') OR instr(upper(pti.type),'TEXT') THEN 'TEXT'
            WHEN instr(upper(pti.type),'BLOB') THEN 'BLOB'
            WHEN instr(upper(pti.type),'REAL') OR instr(upper(pti.type),'FLOA') OR instr(upper(pti.type),'DOUB') THEN 'REAL'
            ELSE 'NUMERIC'
        END AS roomtype ,
        CASE WHEN pti.[notnull] THEN 'Investigate NOT NULL USE' END AS nnindicator,
        sql
    FROM sqlite_master AS sm JOIN pragma_table_info(sm.name) AS pti
    WHERE 
        sm.type = 'table' 
        AND sm.name NOT LIKE 'sqlite_%' 
        AND sm.name <> 'android_metadata' 
        AND (
            upper(pti.type) <> roomtype 
            OR instr(roomtype,'NUMERIC') 
            OR nnindicator IS NOT NULL
            OR dflt_value IS NOT NULL
            OR pk > 0
        )
    ORDER BY sm.name,pti.cid
)
SELECT tablename, columnname, type, roomtype, 
CASE WHEN upper(type) <> upper(roomtype) THEN 'Investigate TYPE should be ' ||roomtype END AS typechange_notes,
CASE WHEN roomtype = 'NUMERIC' THEN 'Investigate NUMERIC' END AS numeric_notes, 
CASE WHEN dflt_value IS NOT NULL THEN 'Investigate DEFAULT VALUE of '||dflt_value END AS default_notes,
CASE WHEN pk > 0 THEN 'Investigate PRIMARY KEY inclusion' END AS primarykey_notes,
nnindicator AS notnull_notes 
FROM potentialRoomChanges
;

示例输出:-

希望列/文本是不言自明的。这基于定义的列类型(可能与使用的类型不同)。例如您可能认为浮点(显示第 5 行)是真实的。但是,根据派生类型关联,已应用第一条规则(如果类型包括 INT,则为 INTEGER)。

规则按照SQLite 版本 3 - 3.1 中的数据类型。柱亲和力的测定 https://www.sqlite.org/datatype3.html.

NUMERIC根据我对 room 的有限经验,它不是它使用的类型,因此应始终将其更改为其他类型之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预打包数据库存在无效架构错误 的相关文章

  • 如何在android中显示对话框之外的图像?

    我试图在对话框片段的顶部显示配置文件图像 一半在图像之外 我在下面附加了示例对话框 就像那样 并尝试了旧 Stackoverflow 解决方案中的所有 FrameLayout 协作 但我无法存档此内容 请给我正确的解决方案 谢谢 Updat
  • Android 中的 Fragment-Fragment 通信

    我在Android编程方面处于初级水平 所以我需要你真诚的帮助 请任何人帮助我 我正在尝试使用片段构建滑动用户界面 所以我真正的疑问是 我有一个Fragment say FragmentA 它有一个TextView and Button在其
  • 使用 Fragment 在工具栏中实现 SearchView

    当前情况 我的应用程序主页由导航抽屉组成 因此我将视图作为片段加载 我的工具栏中也有搜索图标 我在中实现了它menu xml 下一步我实施了SearchView通过以下问题的答案来获取搜索图标在工具栏中实现搜索 https stackove
  • Android 图表[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个项目 其中有一些图表 图形 刻度图 烛台图和范围图 但问题是 没有该图表的库 我有烛台图的
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • Android 全屏对话框确认和拒绝操作

    材料设计中的全屏对话框应该在操作栏 工具栏上有确认和拒绝操作 我的问题是 我该怎么做 显示对话框 getFragmentManager beginTransaction add R id container new MyDialogFrag
  • HMS 核心地图套件在我的 Android 应用程序上根本无法工作

    我正在尝试在我的应用程序中使用华为 HMS 地图套件 我对整体地图很陌生 无论是来自谷歌还是华为 我按照文档中的教程以及华为提供的代码实验室中的说明进行操作 并将我的代码在一起 但是当我运行地图活动时 什么也没有出现 我得到的只是一个空白活
  • Android上如何获取ImageView的Drawable的矩形?

    我想要获取将包裹 ImageView 的 Drawable 的矩形对象 而不是包裹 ImageView 的矩形 我将使用该矩形在 Drawable 周围绘制一些奇特的矩形 我怎样才能得到那个矩形 Rect rect new Rect Ima
  • 透明 9patch 图像:显示出线条

    我得到了一个透明的 9 补丁图像 其中有 9 条补丁线显示槽 This is the output 显然我不希望水平线可见 这就是我创建 9patch 的方式 This is the final image that is used in
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 将 java 中的 byte[] 转换为 C++ 中的 unsigned char* 的正确方法,反之亦然?

    我是 C 和 JNI 的新手 我尝试找到一种正确的方法 通过使用 JNI 将 java 中的 byte 转换为 C 中的 unsigned char 反之亦然 我正在安卓上工作 在谷歌和SO中寻找解决方案后 我还没有找到将java中的byt
  • Android -room 持久库 - DAO 调用是异步的,因此如何获取回调?

    从我读到的Room 不允许您在主线程上发出数据库查询 因为可能会导致主线程延迟 所以想象一下我正在尝试更新 UI 主线程上的文本视图 其中一些数据我将如何得到回调 让我给你举个例子 想象一下 我想将我的业务模型数据存储到一个名为 事件 的对
  • 选项卡主机内的 Android Fragment 视图状态 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Fragment 为 Android 中的每个选项卡单独的返回堆栈 https stackoverflow com questions 6987334 separate back stack f
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • 如何访问我的 Android 程序中的联系人

    我正在制作一个短信应用程序 并且想要访问我的 Android 应用程序中的联系人 我想访问联系人 就像他们在实际联系人列表中一样 选择后 我需要返回到我的活动 在其中我可以向该人发送短信 或者是否可以访问存储联系人的数据库 我的代码如下所示

随机推荐

  • 了解青春痘

    我不明白这个 DI容器 是如何使用的 官方网站上显示的示例没有告诉我任何信息 http pimple sensiolabs org http pimple sensiolabs org 基本上我有一个简单的站点 它由一组类组成 DB 类 C
  • Emacs:Tramp 不起作用

    我尝试通过 Emacs 通过 Tramp 打开远程文件 require tramp setq tramp default method ssh 我收到一条来自 Emacs 的消息 TRAMP 等待远程 shell 的提示 Emacs 挂起并
  • 如何从AVAudioEngine的installTap高频获取缓冲区

    我希望像 iOS 语音备忘录应用程序一样在屏幕上渲染音频波形 因此我使用 AVAudioEngine 并在输入节点上安装 Tap 但它以 0 1 秒的频率提供最快的回调 我需要以更快的频率获取缓冲区数据 以便可以在屏幕上绘制越来越多的波形
  • T4 FieldName 采用驼峰命名法,不带下划线?

    我正在使用 T4 生成一些类定义 并发现我的字段名称前面有一个下划线 我已经设定 code CamelCaseFields true 只是为了安全起见 尽管我知道这是默认设置 但最终仍然是 myField 而不是 myField 如何生成不
  • 将日志文件转换为 json?

    我有以下格式的日志文件 我需要使用 python 将日志文件转换为 json 文件 怎样才能制作出来呢 2015 07 13 00 03 05 976 hostname 1499918592344 UZA Anonymous Anonymo
  • 不带无参数 DbContext 和 DbContextFactory 构造函数的 Add-Migration

    我的应用程序没有无参数构造函数DbContext实现 我不喜欢提供无参数构造函数IDbContextFactory lt gt 执行 原因是我想控制 DbContext 指向的位置 这就是为什么我的所有构造函数都会请求 Connection
  • Unicode 转换为 ASCII 如何知道将 Ł 映射到 L

    我惊讶地发现没有 Unicode 规范化 字符将其映射为类似的东西L combining stroke 这是我理解原因的最佳解释 映射到L而不是 从支持 Unicode 的编码转换为 ASCII 或不具有 Unicode 功能的代码页时 特
  • C# 中的 ONVIF api 捕获图像

    我有一个 ONVIF 网络摄像机 我想从相机捕获图像 以便可以处理该图像并将其保存到文件系统 我发现有一个onvif api提供了一个方法GetSnapshotUri这应该为我提供图像快照 http www onvif org onvif
  • npm 错误! enoent ENOENT: 没有这样的文件或目录,打开 'C:\Users\...\package.json'

    我正在做一个关于 VueJS 的教程 我对此完全陌生 所以不太确定我在做什么 我按照所有说明进行操作 安装了所有软件包 这是我在 VSCode 终端中进行的检查 PS C Users Documents Vue Getting Starte
  • 使用 Thoughtbot Bourbon/Neat 重新排序列

    我正在寻找有关如何使用 Thoughtbot 的 Neat 网格框架在不同断点处重新排序 移动列位置的最佳解决方案 I would like to shift elements in my header from this in deskt
  • 将文件直接导入到 SVN 存储库,无需先签出

    我正在使用 SVN 并且在远程计算机上有一个存储库 有时 在本地计算机上工作时 我意识到需要向存储库添加一些新文件 我知道的通常程序是 在我本地计算机上的当前文件夹中签出整个 SVN 存储库 进入那里 将有趣的文件复制到此处 commit
  • 放弃 const of *this 是否会导致未定义的行为?

    以下代码可编译 看起来运行良好 但这会导致任何未定义的行为吗 我想抛弃 const this 这是为了允许const my iterator改变它指向的数据 Test class A public A const int x x x voi
  • 如何在C++中计算欧拉常数或欧拉幂?

    我正在尝试找到更 自然 的方式来使用该号码e在 C C 中 我专注于计算函数e n 我认为 cmath 默认情况下不提供对两者 函数和常量 的支持 但是 可以启用它来包含编译器定义的常量 在这种情况下 M E 这可以通过包含语句来完成 de
  • 基于开始和结束时间的一天中最活跃的时间

    我正在记录社区中玩家的统计数据 对于他们的在线状态和游戏内状态 我会在它们 开始 和 结束 时进行注册 为了显示一天中最活跃的一天和一小时 我想使用一个 SQL 语句来根据 开始 和 结束 日期时间值来测量最活跃的时刻 看着SQL 从数据库
  • 圆形页面指示器 - 如何更改填充颜色变化

    我在用着查看寻呼指示器 具体来说圆形页面指示器在我的 Android 应用程序中 要求是填色会直接移动到指示器的下一个圆圈 不会出现图中的情况 分页时圆圈移动缓慢 停留在中间 我怎样才能做到这一点 你可以在你的 xml 上试试这个
  • BeautifulSoup 表到数据框

    似乎无法将表中的值正确复制到数据框中 如果运行 raw data 它会输出所有值的列表 知道如何使其结构化吗 pop source requests get http zipatlas com us tx austin zip code c
  • ASP.NET 中的 Cookie 问题。在response.redirect之后恢复值

    我花了很多时间在这上面 这太疯狂了 我有一个页面基类 其中包含 setcookie 函数 基本上是这样的 Dim context As HttpContext System Web HttpContext Current If contex
  • Elm:Json 解码器时间戳到日期

    我正在尝试将时间戳 例如 1493287973015 从 JSON 转换为日期类型 到目前为止 我创建了这个自定义解码器 stringToDate Decoder String gt Decoder Date stringToDate de
  • Windows Azure 网站的 SSL 证书[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在使用新的 Windows Azure 网站预览版为客户构建网站 我最近部署了该网站 并将其移至保留实例 以便我可以根据客户的要求为
  • 预打包数据库存在无效架构错误

    我正在基于旧的 Android 项目构建 Android 应用程序 在我的新应用程序中 我使用 Room 我必须使用第一个项目中使用的相同数据库 此外 我使用 com amitshekhar android debug db 库从第一个项目