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?