Java 无法在房间数据库中插入值

Java 无法在房间数据库中插入值,java,android,android-room,Java,Android,Android Room,我正在尝试插入有关电影的信息,但出现以下错误: java.lang.NullPointerException: Attempt to invoke virtual method 'void kawi15.myapplication.database.DatabaseViewModel.addWatchlistMovie(info.movito.themoviedbapi.model.MovieDb)' on a null object reference 我确信这部电影不是空的,因为我有Toa

我正在尝试插入有关电影的信息,但出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void kawi15.myapplication.database.DatabaseViewModel.addWatchlistMovie(info.movito.themoviedbapi.model.MovieDb)' on a null object reference
我确信这部电影不是空的,因为我有Toast,它显示了关于这部电影的信息

我发现我需要在OnCreate()中初始化
DatabaseViewModel

但我在OnCreate和OnCreateView中尝试了这一点,并在“this”的两个错误中尝试了这一点:

new ViewModelProvider(this)
我试着把getContext()或其他东西放在那里,但这里什么都不起作用

这是我的实体类:

@Entity
public class Watchlist {
    @PrimaryKey
    @ColumnInfo(name = "id")
    private int movieId;

    @ColumnInfo(name = "movie_title")
    private String movieTitle;

    @ColumnInfo(name = "poster_path")
    private String posterPath;

    @ColumnInfo(name = "overview")
    private String overview;

    @ColumnInfo(name = "release_date")
    private String releaseDate;

and getters and setters for all
我的刀类:

@Dao
public interface WatchlistDao {
    @Query("SELECT * FROM watchlist ORDER BY movie_title ASC")
    List<Watchlist> getAll();

    @Insert
    void addMovie(Watchlist watchlistMovie);
}
我要从列表中单击要插入数据库的电影的片段类:

public class FragmentOne extends Fragment /*implements CustomAdapter.ListItemClickListener*/{

    private static RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private DatabaseViewModel databaseViewModel;
    private static RecyclerView recyclerView;
    private List<MovieDb> data;
    //private CustomAdapter.ListItemClickListener mOnClickListener;

    public static FragmentOne newInstance() {
        FragmentOne fragment = new FragmentOne();
        return fragment;
    }

    /*@Override
    public void onListItemClick(int position) {
        Toast.makeText(getContext(), data.get(position).getOriginalTitle(), LENGTH_SHORT).show();
    }*/

    public class MovieTask extends AsyncTask<Void, Void, List<MovieDb>> {
        @Override
        protected List<MovieDb> doInBackground(Void... voids) {
            MovieResultsPage movies = new TmdbApi("f753872c7aa5c000e0f46a4ea6fc49b2").getMovies().getUpcoming("en-US", 1, "US");
            List<MovieDb> listMovies = movies.getResults();

            return listMovies;
        }

        @Override
        protected void onPostExecute(List<MovieDb> movieDb) {
            data = movieDb;
            adapter = new CustomAdapter(data);
            ((CustomAdapter) adapter).setOnMovieDbClicked(movieDb2 -> {
                Toast.makeText(getActivity(), movieDb2.getReleaseDate(), LENGTH_SHORT).show();
                databaseViewModel.addWatchlistMovie(movieDb2);
            });
            recyclerView.setAdapter(adapter);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View returnView = inflater.inflate(R.layout.fragment_one, container, false);


        recyclerView = (RecyclerView) returnView.findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(getContext());  // ???
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());


        MovieTask mt = new MovieTask();
        mt.execute();

        return returnView;
    }


}
公共类FragmentOne扩展片段/*实现CustomAdapter.ListItemClickListener*/{
专用静态RecyclerView.适配器;
private RecyclerView.LayoutManager LayoutManager;
私有数据库视图模型数据库视图模型;
私有静态RecyclerView RecyclerView;
私人名单数据;
//私有CustomAdapter.ListItemClickListener mOnClickListener;
公共静态碎片一个新实例(){
FragmentOne片段=新FragmentOne();
返回片段;
}
/*@凌驾
公共void onListItemClick(内部位置){
Toast.makeText(getContext(),data.get(position).getoriginaltile(),LENGTH_SHORT).show();
}*/
公共类MovieTask扩展了异步任务{
@凌驾
受保护列表背景(无效…无效){
MovieResultsPage movies=newTMDBAPI(“F753872C7AA5C000E0F46A4 EA6FC49B2”).getMovies().getcoming(“en-US”,1,“US”);
List listMovies=movies.getResults();
返回列表电影;
}
@凌驾
受保护的void onPostExecute(列表movieDb){
数据=电影数据库;
适配器=新的CustomAdapter(数据);
((CustomAdapter)adapter).setOnMovieDbClicked(movieDb2->{
Toast.makeText(getActivity(),movieDb2.getReleaseDate(),LENGTH_SHORT).show();
databaseViewModel.addWatchlistMovie(movieDb2);
});
recyclerView.setAdapter(适配器);
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图返回视图=充气机。充气(R.layout.fragment\u one,容器,错误);
recyclerView=(recyclerView)returnView.findViewById(R.id.my\u recycler\u视图);
recyclerView.setHasFixedSize(true);
layoutManager=新的LinearLayoutManager(getContext());/???
recyclerView.setLayoutManager(layoutManager);
setItemAnimator(新的DefaultItemAnimator());
MovieTask mt=新的MovieTask();
mt.execute();
返回视图;
}
}
和我的适配器类,可能不是必需的:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder>{

    private List<MovieDb> dataSet;
    private OnMovieDbClicked onMovieDbClicked;


    public void setOnMovieDbClicked(OnMovieDbClicked onMovieDbClicked) {
        this.onMovieDbClicked = onMovieDbClicked;
    }
    //final private ListItemClickListener mOnClickListener;

    public class MyViewHolder extends RecyclerView.ViewHolder /*implements View.OnClickListener*/{

        TextView textViewName;
        TextView textViewVersion;
        ImageView imageViewIcon;
        //private ListItemClickListener mOnClickListener;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.textViewName = (TextView) itemView.findViewById(R.id.text1);
            this.textViewVersion = (TextView) itemView.findViewById(R.id.text2);
            this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView);

            itemView.setOnClickListener(view -> {
                int pos = getAdapterPosition();

                if (onMovieDbClicked != null && pos != RecyclerView.NO_POSITION) {
                    MovieDb movieDb = dataSet.get(pos);
                    onMovieDbClicked.movieDbClicked(movieDb);
                }
            });
            //itemView.setOnClickListener(this);
            //itemView.setOnClickListener(CustomAdapter.myOnClickListener);
        }

        /*@Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            mOnClickListener.onListItemClick(position);
        }*/
    }

    public CustomAdapter(List<MovieDb> data /*ListItemClickListener mOnClickListener*/) {
        this.dataSet = data;
        //this.mOnClickListener = mOnClickListener;
    }

    public interface OnMovieDbClicked {
        void movieDbClicked(MovieDb movieDb);
    }

    /*public interface ListItemClickListener{
        void onListItemClick(int position);
    }*/

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.cards_layout, parent, false);

        //view.setOnClickListener(FragmentOne.myOnClickListener);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

        TextView textViewName = holder.textViewName;
        TextView textViewVersion = holder.textViewVersion;
        ImageView imageView = holder.imageViewIcon;
        Glide.with(imageView).load("https://image.tmdb.org/t/p/w500" + dataSet.get(listPosition).getPosterPath()).into(imageView);

        textViewName.setText(dataSet.get(listPosition).getOriginalTitle());
        textViewVersion.setText(dataSet.get(listPosition).getReleaseDate());


    }


    @Override
    public int getItemCount() {
        if(dataSet == null){
            return 0;
        }
        return dataSet.size();
    }
}
公共类CustomAdapter扩展了RecyclerView.Adapter{ 私有列表数据集; 私有OnMovieDbClicked OnMovieDbClicked; public void setOnMovieDbClicked(OnMovieDbClicked OnMovieDbClicked){ this.onMovieDbClicked=onMovieDbClicked; } //最终私有列表项ClickListener mOnClickListener; 公共类MyViewHolder扩展了RecyclerView.ViewHolder/*实现了View.OnClickListener*/{ TextView textViewName; 文本视图文本视图版本; 图像视图图像视图图标; //私有ListItemClickListener mOnClickListener; 公共MyViewHolder(查看项目视图){ 超级(项目视图); this.textViewName=(TextView)itemView.findViewById(R.id.text1); this.textViewVersion=(TextView)itemView.findViewById(R.id.text2); this.imageViewIcon=(ImageView)itemView.findViewById(R.id.ImageView); itemView.setOnClickListener(视图->{ int pos=getAdapterPosition(); if(onMovieDbClicked!=null&&pos!=RecyclerView.NO_位置){ MovieDb MovieDb=dataSet.get(pos); onMovieDbClicked.movieDbClicked(movieDb); } }); //setOnClickListener(这个); //setOnClickListener(CustomAdapter.myOnClickListener); } /*@凌驾 公共void onClick(视图v){ int position=getAdapterPosition(); mOnClickListener.onListItemClick(位置); }*/ } 公共CustomAdapter(列表数据/*ListItemClickListener mOnClickListener*/){ this.dataSet=数据; //this.mOnClickListener=mOnClickListener; } 已单击MoviedBClick上的公共接口{ 作废movieDbClicked(MovieDb MovieDb); } /*公共接口ListItemClickListener{ void onListItemClick(内部位置); }*/ @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级, int视图类型){ View=LayoutInflater.from(parent.getContext()) .充气(R.layout.cards\u布局,父级,假); //view.setOnClickListener(FragmentOne.myOnClickListener); MyViewHolder MyViewHolder=新的MyViewHolder(视图); 返回myViewHolder; } @凌驾 公共无效onBindViewHolder(最终MyViewHolder,最终int listPosition){ TextView textViewName=holder.textViewName; TextView textViewVersion=holder.textViewVersion; ImageView ImageView=holder.imageViewIcon; 使用(图像视图)滑动。加载(“https://image.tmdb.org/t/p/w500“+dataSet.get(listPosition.getPosterPath()).into(imageView); textViewName.setText(dataSet.get(listPosition.GetOriginattle()); textViewVersion.setText(dataSet.get(listPosition.getReleaseDate()); } @凌驾 public int getItemCount(){ 如果(数据集==null){ 返回0; } 返回dataSet.size(); } } 您尚未初始化y
public class FragmentOne extends Fragment /*implements CustomAdapter.ListItemClickListener*/{

    private static RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private DatabaseViewModel databaseViewModel;
    private static RecyclerView recyclerView;
    private List<MovieDb> data;
    //private CustomAdapter.ListItemClickListener mOnClickListener;

    public static FragmentOne newInstance() {
        FragmentOne fragment = new FragmentOne();
        return fragment;
    }

    /*@Override
    public void onListItemClick(int position) {
        Toast.makeText(getContext(), data.get(position).getOriginalTitle(), LENGTH_SHORT).show();
    }*/

    public class MovieTask extends AsyncTask<Void, Void, List<MovieDb>> {
        @Override
        protected List<MovieDb> doInBackground(Void... voids) {
            MovieResultsPage movies = new TmdbApi("f753872c7aa5c000e0f46a4ea6fc49b2").getMovies().getUpcoming("en-US", 1, "US");
            List<MovieDb> listMovies = movies.getResults();

            return listMovies;
        }

        @Override
        protected void onPostExecute(List<MovieDb> movieDb) {
            data = movieDb;
            adapter = new CustomAdapter(data);
            ((CustomAdapter) adapter).setOnMovieDbClicked(movieDb2 -> {
                Toast.makeText(getActivity(), movieDb2.getReleaseDate(), LENGTH_SHORT).show();
                databaseViewModel.addWatchlistMovie(movieDb2);
            });
            recyclerView.setAdapter(adapter);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View returnView = inflater.inflate(R.layout.fragment_one, container, false);


        recyclerView = (RecyclerView) returnView.findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(getContext());  // ???
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());


        MovieTask mt = new MovieTask();
        mt.execute();

        return returnView;
    }


}
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder>{

    private List<MovieDb> dataSet;
    private OnMovieDbClicked onMovieDbClicked;


    public void setOnMovieDbClicked(OnMovieDbClicked onMovieDbClicked) {
        this.onMovieDbClicked = onMovieDbClicked;
    }
    //final private ListItemClickListener mOnClickListener;

    public class MyViewHolder extends RecyclerView.ViewHolder /*implements View.OnClickListener*/{

        TextView textViewName;
        TextView textViewVersion;
        ImageView imageViewIcon;
        //private ListItemClickListener mOnClickListener;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.textViewName = (TextView) itemView.findViewById(R.id.text1);
            this.textViewVersion = (TextView) itemView.findViewById(R.id.text2);
            this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView);

            itemView.setOnClickListener(view -> {
                int pos = getAdapterPosition();

                if (onMovieDbClicked != null && pos != RecyclerView.NO_POSITION) {
                    MovieDb movieDb = dataSet.get(pos);
                    onMovieDbClicked.movieDbClicked(movieDb);
                }
            });
            //itemView.setOnClickListener(this);
            //itemView.setOnClickListener(CustomAdapter.myOnClickListener);
        }

        /*@Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            mOnClickListener.onListItemClick(position);
        }*/
    }

    public CustomAdapter(List<MovieDb> data /*ListItemClickListener mOnClickListener*/) {
        this.dataSet = data;
        //this.mOnClickListener = mOnClickListener;
    }

    public interface OnMovieDbClicked {
        void movieDbClicked(MovieDb movieDb);
    }

    /*public interface ListItemClickListener{
        void onListItemClick(int position);
    }*/

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.cards_layout, parent, false);

        //view.setOnClickListener(FragmentOne.myOnClickListener);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

        TextView textViewName = holder.textViewName;
        TextView textViewVersion = holder.textViewVersion;
        ImageView imageView = holder.imageViewIcon;
        Glide.with(imageView).load("https://image.tmdb.org/t/p/w500" + dataSet.get(listPosition).getPosterPath()).into(imageView);

        textViewName.setText(dataSet.get(listPosition).getOriginalTitle());
        textViewVersion.setText(dataSet.get(listPosition).getReleaseDate());


    }


    @Override
    public int getItemCount() {
        if(dataSet == null){
            return 0;
        }
        return dataSet.size();
    }
}