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();
}
}