我一直在处理我的应用上需要从SQLite插入和检索数据的功能。到目前为止,该功能的插入部分正在工作(数据库和表已创建,它们具有值),但检索没有。我有一个NPE,说我在null对象引用上调用了RecyclerView。然后应用程序崩溃了。我在下面提供了我的代码。有什么帮助吗?谢谢!
fetchAllSavedNews()方法:
public ArrayList<News> fetchAllSavedNews() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, allColumns,
null,null,null, null, KEY_DATE + " DESC");
ArrayList<News> newsList = new ArrayList<>();
if(cursor.getCount() > 0) while (cursor.moveToNext()) {
int index0 = cursor.getColumnIndex(KEY_ID);
int index1 = cursor.getColumnIndex(KEY_SERVER_ID);
int index2 = cursor.getColumnIndex(KEY_TITLE);
int index3 = cursor.getColumnIndex(KEY_IMAGE);
int index4 = cursor.getColumnIndex(KEY_CATEGORY);
int index5 = cursor.getColumnIndex(KEY_CONTENT);
int index6 = cursor.getColumnIndex(KEY_AUTHOR);
int index7 = cursor.getColumnIndex(KEY_DATE);
int id = cursor.getInt(index0);
int server_id = cursor.getInt(index1);
String title = cursor.getString(index2);
byte[] imageByteArray = cursor.getBlob(index3);
Bitmap imageBitmap = BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length);
String category = cursor.getString(index4);
String content = cursor.getString(index5);
String author = cursor.getString(index6);
String publicationDate = cursor.getString(index7);
News savedNewsArrayList = new News(id, server_id, title, imageBitmap, category, content, author, publicationDate);
newsList.add(savedNewsArrayList);
}
// return All Employees
return newsList;
}
片段
public class FavoriteNewsFragment extends Fragment implements ConnectivityReceiver.ConnectivityReceiverListener {
public FavoriteNewsFragment() {
// Required empty public constructor
}
final String TAG = "MainPageActivity";
DatabaseHelper myDb;
public RecyclerView rvSavedNews;
public SavedNewsArticleAdapter adapter;
public SwipeRefreshLayout swipeRefreshLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_favorite_news, container, false);
myDb = new DatabaseHelper(getActivity());
checkConnection();
rvSavedNews = (RecyclerView) view.findViewById(R.id.rvSavedNews);
rvSavedNews.setHasFixedSize(true);
final LinearLayoutManager manager = new LinearLayoutManager(getActivity());
rvSavedNews.setLayoutManager(manager);
rvSavedNews.setItemAnimator(new DefaultItemAnimator());
swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
swipeRefreshLayout.setColorSchemeResources(R.color.primaryColor, R.color.primaryTextColor, R.color.secondaryColor);
swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
loadSavedNews();
}
}, 1000);
}
});
return view;
}
private void loadSavedNews() {
adapter = new SavedNewsArticleAdapter(getActivity(), myDb.fetchAllSavedNews());
rvSavedNews.setAdapter(adapter);
swipeRefreshLayout.setRefreshing(false);
}
// Method to manually check connection status
private void checkConnection() {
boolean isConnected = isConnected();
snackInternet(isConnected);
}
private void snackInternet(boolean isConnected) {
if (isConnected) {
Snackbar snackbar = Snackbar.make(getActivity().findViewById(android.R.id.content), "Connected to the Internet!", Snackbar.LENGTH_SHORT);
View sbView = snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.primaryDarkColor));
snackbar.show();
loadSavedNews();
}
else {
Snackbar snackbar = Snackbar
.make(getActivity().findViewById(android.R.id.content), "You seem to be offline.", Snackbar.LENGTH_INDEFINITE)
.setAction("Retry", new View.OnClickListener() {
@Override
public void onClick(View view) {
loadSavedNews();
}
});
View sbView = snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.maroon));
snackbar.show();
loadSavedNews();
}
}
@Override
public void onResume() {
super.onResume();
// register connection status listener
TheFlare.getInstance().setConnectivityListener(this);
}
/**
* Callback will be triggered when there is change in
* network connection
*/
@Override
public void onNetworkConnectionChanged(boolean isConnected) {
snackInternet(isConnected);
}
}
适配器
public class SavedNewsArticleAdapter extends RecyclerView.Adapter<SavedNewsArticleAdapter.SavedNewsViewHolder> {
private Context context;
private ArrayList<News> savedNews;
public SavedNewsArticleAdapter(Context context, ArrayList<News> savedNews){
this.context = context;
this.savedNews = savedNews;
}
@Override
public SavedNewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.from(parent.getContext())
.inflate(R.layout.news_cardview_layout, parent, false);
SavedNewsViewHolder savedNewsViewHolder = new SavedNewsViewHolder(view);
return savedNewsViewHolder;
}
@Override
public void onBindViewHolder(SavedNewsViewHolder holder, int position) {
final News selectedSavedNews = savedNews.get(position);
holder.tvId.setText(String.valueOf(selectedSavedNews.getId()));
holder.tvTitle.setText(selectedSavedNews.getTitle());
holder.tvPubDate.setText("" + selectedSavedNews.getPublicationDate());
Picasso.with(context)
.load(selectedSavedNews.getImgBanner())
.placeholder(R.drawable.bannerplaceholder)
.error(android.R.drawable.stat_notify_error)
.into(holder.ivImage);
holder.ivImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View view) {
Intent intent = new Intent(context, SavedNewsDetailActivity.class);
intent.putExtra("savedNews", selectedSavedNews);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
if(savedNews != null){
return savedNews.size();
}
return 0;
}
//ViewHolder class
public static class SavedNewsViewHolder extends RecyclerView.ViewHolder{
public CardView cvNews;
public TextView tvId;
public ImageView ivImage;
public TextView tvTitle;
public TextView tvPubDate;
public SavedNewsViewHolder(View itemView) {
super(itemView);
cvNews = (CardView)itemView.findViewById(R.id.cvNews);
tvId = (TextView) itemView.findViewById(R.id.tvId);
ivImage = (ImageView)itemView.findViewById(R.id.ivImageUrl);
tvTitle = (TextView)itemView.findViewById(R.id.tvTitle);
tvPubDate = (TextView)itemView.findViewById(R.id.tvPubDate);
}
}
}
NPE
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cvsuimus.theflare, PID: 23967
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at com.cvsuimus.theflare.FavoriteNewsFragment.loadSavedNews(FavoriteNewsFragment.java:67)
at com.cvsuimus.theflare.FavoriteNewsFragment.snackInternet(FavoriteNewsFragment.java:83)
at com.cvsuimus.theflare.FavoriteNewsFragment.checkConnection(FavoriteNewsFragment.java:74)
at com.cvsuimus.theflare.FavoriteNewsFragment.onCreateView(FavoriteNewsFragment.java:38)