我想显示notedao中favcount的总和,所以我在livedata和viewmodel中这样做
@Dao
public interface NoteDao {
@Query("SELECT * FROM notes ORDER BY id DESC")
List<Note> getAllNotes();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertNote(Note note);
@Delete
void deleteNote(Note note);
@Query("SELECT SUM(fav_count) as favSum FROM notes")
LiveData<String> getFavSum();
}
这是我的实体“笔记”有fav\u计数
@Entity(tableName = "notes")
@ColumnInfo(name = "fav_count")
private String favCount;
public Note() {}
public String getFavCount() { return favCount; }
public void setFavCount(String favCount) { this.favCount = favCount;}
这是我的存储库
public class totalRepository {
NoteDao noteDao;
public LiveData<String> getTotal() {
return noteDao.getFavSum();
}
}
这是我的viewmodel
public class NoteViewModel extends ViewModel {
public final totalRepository repository;
public LiveData<String> getmTotal(){
return repository.getTotal();
}
public NoteViewModel(totalRepository repository) {
this.repository = repository;
}
}
这是我要显示数据的活动
public class Statistics extends AppCompatActivity {
TextView syukrsum;
String favSum = "0";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_statistics);
NoteViewModel noteViewModel;
syukrsum = findViewById(R.id.syukrSum);
noteViewModel = new ViewModelProvider(this).get(NoteViewModel.class);
noteViewModel.getmTotal().observe(Statistics.this, new Observer<String>() {
@Override
public void onChanged(String string) {
if (string == null) {
favSum = "0";
syukrsum.setText(0);
} else {
favSum = string;
syukrsum.setText(string);
}
}
});
}
}
当我打开“统计”活动时,我的应用程序崩溃并出现以下错误:
2020-12-04 14:40:01.630 26822-26822/com.rhlab.syukr5 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.rhlab.syukr5, PID: 26822
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rhlab.syukr5/com.rhlab.syukr5.Activities.Statistics}: java.lang.RuntimeException: Cannot create an instance of class com.rhlab.syukr5.NoteViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3170)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3307)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2036)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7081)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.rhlab.syukr5.NoteViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at com.rhlab.syukr5.Activities.Statistics.onCreate(**Statistics.java:31**)
at android.app.Activity.performCreate(Activity.java:7258)
at android.app.Activity.performCreate(Activity.java:7249)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3150)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3307)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2036)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7081)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
Caused by: java.lang.InstantiationException: java.lang.Class<com.rhlab.syukr5.NoteViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
**at com.rhlab.syukr5.Activities.Statistics.onCreate(Statistics.java:31)**
at android.app.Activity.performCreate(Activity.java:7258)
at android.app.Activity.performCreate(Activity.java:7249)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3150)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3307)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2036)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7081)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
错误出现在statistics.java第31行
noteViewModel = new ViewModelProvider(this).get(NoteViewModel.class);
问题是:我犯了什么错?对不起,如果我的问题不清楚,请记住,我是一个新手,可能我做了巨大或愚蠢的错误,请与我忍受,并请解释解决办法!
1条答案
按热度按时间zazmityj1#
它正在崩溃,因为它无法创建viewmodel的示例。为什么?
因为默认情况下,它只创建viewmodel的示例,如果它有zeo构造函数参数的话。但是viewmodel有一个构造函数参数。
您的noteviewmodel需要totalrepository示例作为构造函数参数,而您并没有告诉它从何处获取。
因此,解决方案是创建viewmodelfactory。
下面是示例代码:
从片段中,您需要创建viewmodel,如下所示: