【问题标题】:app crashing after insert entity to my room database将实体插入我的房间数据库后应用程序崩溃
【发布时间】:2021-05-16 12:12:15
【问题描述】:

我是房间数据库的新手,我正在尝试制作一个数据库来在我的列表中插入单词(每次都会从我这里得到 2 个单词) 所以我想测试它,但我得到了这个错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.paradise.personaldictionary, PID: 9307
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.paradise.personaldictionary/com.paradise.personaldictionary.MainActivity}: java.lang.IllegalArgumentException: File EN/FA_DB contains a path separator
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3308)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3457)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.IllegalArgumentException: File EN/FA_DB contains a path separator
        at android.app.ContextImpl.makeFilename(ContextImpl.java:2671)
        at android.app.ContextImpl.getDatabasePath(ContextImpl.java:865)
        at android.content.ContextWrapper.getDatabasePath(ContextWrapper.java:341)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:371)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:317)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:145)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:106)
        at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:622)
        at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:399)
        at com.paradise.personaldictionary.roomdb.WordsDao_Impl.insert(WordsDao_Impl.java:77)
        at com.paradise.personaldictionary.MainActivity.test(MainActivity.kt:55)
        at com.paradise.personaldictionary.MainActivity.onCreate(MainActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:7893)
        at android.app.Activity.performCreate(Activity.java:7880)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3283)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3457) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:224) 
        at android.app.ActivityThread.main(ActivityThread.java:7562) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

这是他告诉我要修复的错误行

at com.paradise.personaldictionary.roomdb.WordsDao_Impl.insert(WordsDao_Impl.java:77)
        at com.paradise.personaldictionary.MainActivity.test(MainActivity.kt:55)
        at com.paradise.personaldictionary.MainActivity.onCreate(MainActivity.kt:23)

这是关于我的插入功能

这是我在wordDao类中插入的乐趣

 @Insert
    fun insert( words: Words)

还有我在activity main中的有趣的test()

fun test(){
        val db: AppDatabase = AppDatabase.getDatabase(this)
        var firstword = Words("Hello","salam")
        db.wordsDao().insert(firstword)
        var getDb = db.wordsDao().getAll()
    }

更新 新错误

  Accessing hidden field Landroid/database/sqlite/SQLiteDatabase;->mLock:Ljava/lang/Object; (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V (greylist-max-o, linking, denied)
    Accessing hidden field Landroid/database/sqlite/SQLiteDatabase;->mLock:Ljava/lang/Object; (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/database/sqlite/SQLiteSession;->setTransactionSuccessful()V (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/content/ContentValues;->isEmpty()Z (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I (greylist-max-o, linking, denied)
    Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->yieldIfContendedHelper(ZJ)Z (greylist-max-o, linking, denied)
I/chatty: uid=10415(com.paradise.personaldictionary) ection primary] identical 1 line
W/sonaldictionar: Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->yieldIfContendedHelper(ZJ)Z (greylist-max-o, linking, denied)
V/StudioTransport: Handling agent command 1200 for pid: 19307.
I/sonaldictionar: ProcessProfilingInfo new_methods=1550 is saved saved_to_disk=1 resolve_classes_delay=8000

在我的 logcat 和调试窗口中有很多这样的行

【问题讨论】:

  • 你能发布完整的 MainActivity.kt 文件吗

标签: android kotlin android-room


【解决方案1】:

这是你的问题:

Caused by: java.lang.IllegalArgumentException: File EN/FA_DB contains a path separator

看起来当你初始化你的数据库时你传递了一个无效的文件名。

在某处你正在做这样的事情:

Room.databaseBuilder(applicationContext, AppDatabase::class.java, "EN/FA_DB")

不允许使用"EN/FA_DB"。您只需指定一个不包含路径分隔符或其他特殊字符的文件名。类似"test.db"

【讨论】:

  • 它正在运行,谢谢,应用程序不再崩溃,但它仍然无法运行。它说明了 SQL 中拒绝访问的情况。错误地提出了问题
  • 这些错误可能会被忽略。你怎么知道“它不起作用”?
  • 您的设备(或模拟器)运行的是哪个版本的 Android?你的 targetSDK 是什么?
  • 另外,您是否在应用中使用任何 3rd-party 库?
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多