【问题标题】:FileNotFoundException - Cannot import json with Room instanceFileNotFoundException - 无法使用 Room 实例导入 json
【发布时间】: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

【问题讨论】:

    标签: android json kotlin android-room


    【解决方案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文件夹内,否则不起作用。

    创建原始文件夹:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2019-09-19
    • 2022-06-23
    • 1970-01-01
    • 2018-08-31
    • 2021-07-09
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多