Android 尝试获取项目或插入时使用文件室持久性返回空数据库
使用文件室持久性时,当尝试在项目中插入或选择数据库时,会出现以下错误: 空对象引用上的AppDataBase.getMovieDao() 与该过程相关的类别如下: AppDataBase类:Android 尝试获取项目或插入时使用文件室持久性返回空数据库,android,Android,使用文件室持久性时,当尝试在项目中插入或选择数据库时,会出现以下错误: 空对象引用上的AppDataBase.getMovieDao() 与该过程相关的类别如下: AppDataBase类: @Database(entities = {Movies.class}, version = 1) public abstract class AppDataBase extends RoomDatabase { public static final String DB_NAME = "Movi
@Database(entities = {Movies.class}, version = 1)
public abstract class AppDataBase extends RoomDatabase {
public static final String DB_NAME = "Movies";
private static AppDataBase INSTANCE;
public static AppDataBase getDataBase(Context context){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),AppDataBase.class,DB_NAME).build();
}
return INSTANCE;
}
public abstract MovieDao getMovieDao();
}
Dao类:
@Dao
public interface MovieDao {
@Insert
void insertAll(Movies movies);
@Update
void updateAll(Movies... notes);
@Query("SELECT * FROM moviestb")
List<Movies> getAll();
@Delete
void deleteAll(Movies... notes);
}
正在搜索注册:
public void loadFromDB(){
db.getDataBase(view.getContext());
if(db.getMovieDao().getAll().size() > 0){
adapter.setResults(db.getMovieDao().getAll());
}else{
Toast.makeText(view.getContext(),"Não há filmes cadastrados",Toast.LENGTH_SHORT).show();
view.getActivity().finish();
}
}
插入:
public View.OnClickListener onSaveClick(final String plot, final String diretor, final String autor,
final String nome, final String tipo, final String ano, final String ator, final String imdb) {
return new View.OnClickListener() {
@Override
public void onClick(View itemView) {
db.getDataBase(view.getContext());
Movies movies = new Movies(nome,plot,imdb,"",ator,ano,tipo,diretor,autor);
new InsertAsyncTask(db).execute(movies);
}
};
}
private class InsertAsyncTask extends AsyncTask<Movies,Void,Void>{
private AppDataBase db;
public InsertAsyncTask(AppDataBase appDataBase) {
db = appDataBase;
}
@Override
protected Void doInBackground(Movies... params) {
db.getMovieDao().insertAll(params[0]);
return null;
}
}
获取数据库时发生崩溃,我做错了什么?谢谢大家!
db
显然是null
。你的问题没有显示你在哪里给它赋值
请注意,
getDataBase()
是一种静态方法。也许您应该在某个地方有一个db=AppDataBase.getDataBase()
语句。db
显然是null
。你的问题没有显示你在哪里给它赋值
请注意,getDataBase()
是一种静态方法。也许您应该在某个地方有一个db=AppDataBase.getDataBase()
语句。是的,我的数据库是空的。例如,我在loadfromdb上获得de值。@HenriqueMendes:请理解所有db.getDataBase(view.getContext())代码>调用是无用的。首先,db
是null
,因此它们应该崩溃。其次,忽略返回值,这是调用该方法的关键。是的!非常感谢。是的,我的数据库是空的。例如,我在loadfromdb上获得de值。@HenriqueMendes:请理解所有db.getDataBase(view.getContext())代码>调用是无用的。首先,db
是null
,因此它们应该崩溃。其次,忽略返回值,这是调用该方法的关键。是的!非常感谢。
public View.OnClickListener onSaveClick(final String plot, final String diretor, final String autor,
final String nome, final String tipo, final String ano, final String ator, final String imdb) {
return new View.OnClickListener() {
@Override
public void onClick(View itemView) {
db.getDataBase(view.getContext());
Movies movies = new Movies(nome,plot,imdb,"",ator,ano,tipo,diretor,autor);
new InsertAsyncTask(db).execute(movies);
}
};
}
private class InsertAsyncTask extends AsyncTask<Movies,Void,Void>{
private AppDataBase db;
public InsertAsyncTask(AppDataBase appDataBase) {
db = appDataBase;
}
@Override
protected Void doInBackground(Movies... params) {
db.getMovieDao().insertAll(params[0]);
return null;
}
}
public void loadFromDB(){
db.getDataBase(view.getContext());
if(db.getMovieDao().getAll().size() > 0){
adapter.setResults(db.getMovieDao().getAll());
}else{
Toast.makeText(view.getContext(),"Não há filmes cadastrados",Toast.LENGTH_SHORT).show();
view.getActivity().finish();
}
}