完整错误堆栈跟踪:
04-05 16:01:34.265 18746-18746 /? E / AndroidRuntime:FATAL EXCEPTION:main进程:com.example.mrathi.livedataviewmodel,PID:18746 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.mrathi.livedataviewmodel / com.example.mrathi.livedataviewmodel.MainActivity在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)上的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)的android.app.ActivityThread.-wrap12(ActivityThread.java)处的kotlin.KotlinNullPointerException android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1477)在android.app.Handler.dispatchMessage(Handler.java:102)android.app.Looper.loop(Looper.java:154)android.app .ActivityThread.main(ActivityThread.java:6119)位于com.android的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)的java.lang.reflect.Method.invoke(Native Method) .internal.os.ZygoteInit.main(ZygoteInit.java:776)引起:com.example.mrathi.li的kotlin.KotlinNullPointerException android.app.ActivityThread.performLaunchActivity上android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)的android.app.Activity.performCreate(Activity.java:6679)上的vedataviewmodel.MainActivity.onCreate(MainActivity.kt:40) (ActivityThread.java:2618)位于android.app.A活动时的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)android.app.ActivityThread $ H.handleMessage(ActivityThread.java)上的android.app.ActivityThread.-wrap12(ActivityThread.java) :1477)在Android.os.Handler.dispatchMessage(Handler.java:102)的android.app.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(ActivityThread.java:6119)在java位于com.android.internal.os.ZygoteInit的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)中的.lang.reflect.Method.invoke(Native Method)(ZygoteInit.java: 776)
这是我的带有api的数据库类(在Kotlin中使用MVVM模型)
@Database(entities = arrayOf(BorrowModel::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
companion object {
var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
if (INSTANCE == null) {
**INSTANCE = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "borrow_db")
.build()** through target invocation exception
}
return INSTANCE as AppDatabase
}
}
abstract fun itemAndPersonModel(): BorrowModelDao
}
这是我用于观察UI更新的数据库更改的活动代码:
class MainActivity : AppCompatActivity() , View.OnLongClickListener {
override fun onLongClick(v: View?): Boolean {
val borrowModel = v!!.getTag() as BorrowModel
viewModel!!.deleteItem(borrowModel)
return true
}
var viewModel: BorrowedListViewModel? = null
// private var recyclerViewAdapter: RecyclerViewAdapter? = null
// private var recyclerView: RecyclerView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var users = ArrayList<BorrowModel>()
var obj_adapter = RecyclerViewAdapter(users, this);
recyclerView.layoutManager = LinearLayoutManager(this,
LinearLayout.VERTICAL, false)
recyclerView.adapter = obj_adapter
try {
viewModel =
ViewModelProviders.of(this).get(BorrowedListViewModel::class.java)
}catch ( e :Exception){
e.toString()
}
viewModel!!.getItemAndPersonList()!!.observe(this, object :
Observer<List<BorrowModel>?> {
override fun onChanged(t: List<BorrowModel>?) {
Log.v("OnChanged","OnChanged!!")
obj_adapter.addItems(t)
}
})
}
}
这是 ViewModel
类:
class BorrowedListViewModel(application: Application) : AndroidViewModel(application) {
private var itemAndPersonList: LiveData<List<BorrowModel>>? = null
private var appDatabase: AppDatabase? = null
init {
appDatabase = AppDatabase.getDatabase(this.getApplication())
itemAndPersonList = appDatabase!!.itemAndPersonModel().getAllBorrowedItems()
}
fun getItemAndPersonList(): LiveData<List<BorrowModel>>? {
return itemAndPersonList
}
fun deleteItem(borrowModel: BorrowModel) {
deleteAsyncTask(appDatabase!!).execute(borrowModel)
}
class deleteAsyncTask internal constructor(private var db: AppDatabase) : AsyncTask<BorrowModel, Void, Void>() {
override fun doInBackground(vararg params: BorrowModel): Void? {
db.itemAndPersonModel().deleteBorrow(params[0])
return null
}
}
}