FileNotFoundException - 无法使用 Room 实例导入 json

Posted

技术标签:

【中文标题】FileNotFoundException - 无法使用 Room 实例导入 json【英文标题】:FileNotFoundException - Cannot import json with Room instance 【发布时间】:2021-11-13 03:51:04 【问题描述】:

我正在尝试使用原始文件夹中的简单 JSON 填充我的 ROOM 数据库,这是我的代码

fun getInstance(context: Context): CarDatabase 
    if(instance == null) 
        instance =  Room.databaseBuilder (
            context,
            CarDatabase::class.java, "cars_table"
        ).createFromAsset("app/res/raw/cars_sample.json").build()
    
    return instance as CarDatabase

我明白了

原因:java.io.FileNotFoundException: app/res/raw/cars_sample.json

【问题讨论】:

【参考方案1】:

除非您的模块有src/main/assets/app/res/raw/cars_sample.json,否则这不是assets/ 中指向您的JSON 的有效路径。而且,由于 android 找不到那个 JSON,我猜你的模块没有那个资产。

从您使用的外观来看,我猜您正在尝试从原始资源填充您的数据库。原始资源类似于资产,但它们不是资产。

您需要create an assets/ directory for your module 并将您的 JSON 移到那里。

【讨论】:

嗨,感谢您的回答,但我认为我无法将 json 移动到资产,因为我的要求是从原始资源文件夹填充我的数据库,有什么办法吗? @SNM:您可以尝试在Resources 上使用openRawResource() 来获得InputStream 并使用with createFromInputStream() on RoomDatabase.Builder。不过我还没试过。【参考方案2】:

由于 Android Studio 使用新的基于 Gradle 的构建系统,您应该将 assets/ 放在源集内(例如,src/main/assets/)。

在典型的 Android Studio 项目中,您将拥有一个 app/ 模块,其中包含一个 main/ 源集(app/src/main/ 位于项目根目录之外),因此您的主要资产将位于 app/src/main /资产/。然而:

如果您需要特定于构建类型的资产,例如调试与发布,您可以为这些角色创建源集(例如,app/src/release/assets/)

您的产品风格还可以包含带有资产的源集(例如,app/src/googleplay/assets/)

您的仪器测试可以有一个带有自定义资产(例如,app/src/androidTest/assets/)的 androidTest 源集,但请务必向 InstrumentationRegistry 询问 getContext(),而不是 getTargetContext(),以访问这些资产

另外,快速提醒一下:资产在运行时是只读的。使用内部存储、外部存储或存储访问框架来读取/写入内容。

raw文件夹必须在res文件夹内,否则不起作用。

创建原始文件夹:

    右键单击 res 文件夹。 选择新建。 选择 Android 资源目录。 将目录命名为 raw。 在资源类型部分添加 raw。 点击确定。

【讨论】:

我已经在资源下面的 raw 文件夹中有 json,不工作 看看***.com/questions/18302603/…

以上是关于FileNotFoundException - 无法使用 Room 实例导入 json的主要内容,如果未能解决你的问题,请参考以下文章

检测 java.io.FileNotFoundException 的根本原因

IntelliJ“FileNotFoundException”,文件存在

如何解决 System.IO.FileNotFoundException?

为啥 FileOutputStream 会抛出 FileNotFoundException?

java.io.FileNotFoundException:(访问被拒绝)

FileNotFoundException:EACCES(权限被拒绝)