您好,我正在使用房間資料庫創建相冊應用程式。但是當我運行該應用程式時,我收到一個錯誤,提示無法創建 viewmodel 類的實體。您的幫助將不勝感激。這是logcat
592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2021-10-08 09:18:55.708 23415-23415/com.example.photoalbum I/Process:發送信號。PID:23415 SIG:9
這是 Viewmodel 類
package com.example.photoalbum;
import android.app.Application;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProvider;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import java.util.List;
public class MyImagesVIewModel extends AndroidViewModel {
private MyImagesRepository repository;
private LiveData<List<MyImages>> imageList;
public MyImagesVIewModel(@NonNull Application application) {
super(application);
repository = new MyImagesRepository(application);
imageList = repository.getAllImages();
}
public void insert(MyImages myImages){
repository.insert(myImages);
}
public void delete(MyImages myImages){
repository.delete(myImages);
}
public void update(MyImages myImages){
repository.update(myImages);
}
public LiveData<List<MyImages>> getAllImages(){
return imageList;
}
}
here is my repository classs
package com.example.photoalbum;
import android.app.Application;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import java.util.ArrayList;
import java.util.List;
public class MyImagesRepository {
private MyImagesDAO myImagesDAO;
private LiveData<List<MyImages>> imagesList;
public MyImagesRepository(Application application){
MyImagesDatabase database = MyImagesDatabase.getInstance(application);
myImagesDAO = database.myImagesDAO();
imagesList = myImagesDAO.getAllImages();
}
public void insert(MyImages myImages){
new InsertImageAsyncTask(myImagesDAO).execute(myImages);
}
public void delete(MyImages myImages){
new DeleteImageAsyncTask(myImagesDAO).execute(myImages);
}
public void update(MyImages myImages){
new UpdateImageAsyncTask(myImagesDAO).execute(myImages);
}
public LiveData<List<MyImages>> getAllImages(){
return imagesList;
}
public static class InsertImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public InsertImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.insert(myImages[0]);
return null;
}
}
public static class DeleteImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public DeleteImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.delete(myImages[0]);
return null;
}
}
public static class UpdateImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public UpdateImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.update(myImages[0]);
return null;
}
}
}
這是我的主要活動
package com.example.photoalbum;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MyImagesVIewModel myImagesVIewModel;
private RecyclerView rv;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = findViewById(R.id.rv);
fab = findViewById(R.id.fab);
rv.setLayoutManager(new LinearLayoutManager(this));
MyImagesAdapter adapter = new MyImagesAdapter();
rv.setAdapter(adapter);
myImagesVIewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication())
.create(MyImagesVIewModel.class);
//ViewModelProvider.Factory
// which may create AndroidViewModel and ViewModel, which have an empty constructor.
myImagesVIewModel.getAllImages().observe(MainActivity.this, new Observer<List<MyImages>>() {
@Override
public void onChanged(List<MyImages> myImages) {//called when data is changed
adapter.setImagesList(myImages);
}
//observer updates the UI
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddImageActivity.class);
startActivityForResult(intent, 3);
}
});
}
}
這是我的存盤庫類
package com.example.photoalbum;
import android.app.Application;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import java.util.ArrayList;
import java.util.List;
public class MyImagesRepository {
private MyImagesDAO myImagesDAO;
private LiveData<List<MyImages>> imagesList;
public MyImagesRepository(Application application){
MyImagesDatabase database = MyImagesDatabase.getInstance(application);
myImagesDAO = database.myImagesDAO();
imagesList = myImagesDAO.getAllImages();
}
public void insert(MyImages myImages){
new InsertImageAsyncTask(myImagesDAO).execute(myImages);
}
public void delete(MyImages myImages){
new DeleteImageAsyncTask(myImagesDAO).execute(myImages);
}
public void update(MyImages myImages){
new UpdateImageAsyncTask(myImagesDAO).execute(myImages);
}
public LiveData<List<MyImages>> getAllImages(){
return imagesList;
}
public static class InsertImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public InsertImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.insert(myImages[0]);
return null;
}
}
public static class DeleteImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public DeleteImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.delete(myImages[0]);
return null;
}
}
public static class UpdateImageAsyncTask extends AsyncTask<MyImages,Void,Void>{
MyImagesDAO myImagesDAO;
public UpdateImageAsyncTask(MyImagesDAO myImagesDAO) {
this.myImagesDAO = myImagesDAO;
}
@Override
protected Void doInBackground(MyImages... myImages) {
myImagesDAO.update(myImages[0]);
return null;
}
}
}
uj5u.com熱心網友回復:
這是因為NullPointerExcepion在ViewModel建構式中。
您會在日志中看到 。
java.lang.NullPointerException: Attempt to invoke virtual method 'com.example.photoalbum.MyImagesDAO com.example.photoalbum.MyImagesDatabase.myImagesDAO()' on a null object reference at com.example.photoalbum.MyImagesRepository.
在您的存盤庫類中
public MyImagesRepository(Application application){
MyImagesDatabase database = MyImagesDatabase.getInstance(application);
myImagesDAO = database.myImagesDAO(); //here database seems to be null.
imagesList = myImagesDAO.getAllImages();
}
uj5u.com熱心網友回復:
也許您的視圖模型的建構式有問題。試試這個建構式-
myImagesVIewModel=new ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get( MyImagesVIewModel.class);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328261.html
標籤:爪哇 安卓工作室 例外 android-room
