##質問内容
1:RoomDatabaseのインスタンスを生成しようとしたらCaused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Package.getName()' on a null object reference
というエラーが出てきたのですが、Roomを扱うには何のパッケージが必要なのでしょうか?
2:自分はRoomDatabaseがSQLiteを含めたパッケージだと認識していたのですが、もしかしてRoomDatabaseとはDB Helperのようなもので、SQLite自体は別に用意しなければならないのでしょうか?
##疑問に至るまでの経緯
現在作成中のアプリ内でRoomDatabaseを使おうとしています。
使用言語はKotlinで、このQiitaの記事を参考にRoomを導入しました。
EntityとDAOとAppDatabaseクラスを作成し、その状態で動くことは確認しました。
次に、RoomDatabaseのインスタンスを作成するため以下のコードをプロジェクト内に追記しました。
// Kotlin val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "applyDatabase").build()
しかし、上記のコードを追記したActivityに移動した瞬間、以下のエラーポップアップが出てきてアプリが異常終了してしまいます("To Did List"はアプリの名前です)。
AndroidStudioのLogcatを見てみると、以下のようなエラーが出ていることが確認できました(見やすいようにCaused by: java.lang.NullPointerException:の後ろで改行しています)。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Package.getName()' on a null object reference at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:77) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:454) at com.example.user.todidlist.EditDiaryActivity.onCreate(EditDiaryActivity.kt:16)
Room.javaの77行目でNullPointerExceptionが出ているとのことですが、該当コードは以下のようになっていました。
java
1// Room.java 2static <T, C> T getGeneratedImplementation(Class<C> klass, String suffix) { // 76行目 3 final String fullPackage = klass.getPackage().getName(); // 77行目
77行目にブレークポイントを挟んでみると、76行目の横にklass: "class AppDatabase" suffix: "_Impl"
というのが見えたので、klassではなくklass.getPackage()がNullであることがわかりました。
以上が今回の疑問に至った経緯です。
冒頭にも書きましたが、現在の疑問は以下の二つです。
0. klass.getPackage()で求められているパッケージとは何でしょうか?
必要なライブラリなどはapp/build.gradleにすべて書いたつもりなのですが、何か欠けているのでしょうか?
0. 今回のエラーとは関係あるかわかりませんが、SQLiteはRoomとは別に用意しなければならないのでしょうか?
自分はRoomDatabaseがSQLiteを含めてたパッケージだという認識なのですが、RoomDatabaseはあくまでDB Helperの代わりでありSQLite自体を含んでいるわけではないのでしょうか?
##RoomDatabaseを使うために追記したコード
// app/build.gradle apply plugin: 'kotlin-kapt' // 略 dependencies { //略 implementation "android.arch.persistence.room:runtime:1.0.0" kapt "android.arch.persistence.room:compiler:1.0.0" }
// Daily.kt @Entity class Diary { /** * PrimaryKey is Non-null */ @PrimaryKey var did: Int = 0 // 略 }
// DiaryDao.kt @Dao interface DiaryDao{ @Query("SELECT * FROM diary") fun getAll(): List<Diary> @Insert fun insert(diary: Diary) @Delete fun delete(diary: Diary) }
// AppDatabase.kt @Database(entities = [Diary::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun diaryDao(): DiaryDao }
// EditDiaryActivity.kt RoomDatabaseのインスタンスを生成しようとしたActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_edit_diary.* import AppDatabase import android.arch.persistence.room.Room class EditDiaryActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit_diary) val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "applyDatabase").build() }
##環境情報
Kotlin version 1.2.30 (JRE 1.8.0_152-release-915-b01)
Android Studio 3.0.1

回答1件
あなたの回答
tips
プレビュー