空对象引用,使用SQLite数据库

时间:2018-10-23 04:47:31

标签: android sqlite android-studio textview android-sqlite

我正在尝试为我的应用程序在SQLite数据库中存储数据,但收到错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at jackg.myreceipts.ReceiptListFragment$ReceiptHolder.bind(ReceiptListFragment.java:124)
    at jackg.myreceipts.ReceiptListFragment$ReceiptAdapter.onBindViewHolder(ReceiptListFragment.java:149)
    at jackg.myreceipts.ReceiptListFragment$ReceiptAdapter.onBindViewHolder(ReceiptListFragment.java:133)

以前,它工作正常,但是尝试添加另一个字段后,我看不到哪里出了问题,我查看了其他问题的答案,但是看不到任何关系,因为我添加了制作上一个{ {1}}正常工作,将名称和相应信息更改为SHOP_NAME,但未成功。

代码如下。

ReceiptListFragment:

INFO

ReceiptBaseHelper:

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;



public class ReceiptListFragment extends Fragment {

    private static final String SAVED_SUBTITLE_VISIBLE = "subtitle";

    private RecyclerView mReceiptRecyclerView;
    private ReceiptAdapter mAdapter;
    private boolean mSubtitleVisible;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_receipt_list, container, false);
        mReceiptRecyclerView = (RecyclerView) view
                .findViewById(R.id.receipt_recycler_view);
        mReceiptRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        if (savedInstanceState != null) {
            mSubtitleVisible = savedInstanceState.getBoolean(SAVED_SUBTITLE_VISIBLE);
        }
        updateUI();
        return view;
    }


    @Override
    public void onResume() {
        super.onResume();
        updateUI();
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_SUBTITLE_VISIBLE, mSubtitleVisible);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_receipt_list, menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.new_receipt:
                Receipt receipt = new Receipt();
                ReceiptLab.get(getActivity()).addReceipt(receipt);
                Intent intent = ReceiptPagerActivity
                        .newIntent(getActivity(), receipt.getId());
                startActivity(intent);
                return true;
            case R.id.help_button:
                Intent intent1 = new Intent(ReceiptListFragment.this.getActivity(), Help.class);
                startActivity(intent1);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }


    }

    private void updateUI() {
        ReceiptLab receiptLab = ReceiptLab.get(getActivity());
        List<Receipt> receipts = receiptLab.getReceipts();
        if (mAdapter == null) {
            mAdapter = new ReceiptAdapter(receipts);
            mReceiptRecyclerView.setAdapter(mAdapter);
        } else {
            mAdapter.setReceipts(receipts);
            mAdapter.notifyDataSetChanged();
        }
    }

    private class ReceiptHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView mTitleTextView;
        private TextView mShopTextView;
        private TextView mDateTextView;
        private TextView mInfoTextView;
        private Receipt mReceipt;

        public ReceiptHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.list_item_receipt, parent, false));
            itemView.setOnClickListener(this);

            mTitleTextView = (TextView) itemView.findViewById(R.id.receipt_title);
            mShopTextView = (TextView) itemView.findViewById(R.id.receipt_shop_name);
            mInfoTextView = (TextView) itemView.findViewById(R.id.receipt_info);
            mDateTextView = (TextView) itemView.findViewById(R.id.receipt_date);
        }
        public void bind(Receipt receipt) {
            mReceipt = receipt;
            mTitleTextView.setText(mReceipt.getTitle());
            mShopTextView.setText(mReceipt.getShopName());
            mInfoTextView.setText(mReceipt.getInfo());
            mDateTextView.setText(mReceipt.getDate().toString());
        }
        @Override
        public void onClick(View view) {
            Intent intent = ReceiptPagerActivity.newIntent(getActivity(), mReceipt.getId());
            startActivity(intent);
        }
    }
        private class ReceiptAdapter extends RecyclerView.Adapter<ReceiptHolder> {
            private List<Receipt> mReceipts;

            public ReceiptAdapter(List<Receipt> receipts) {
                mReceipts = receipts;
            }

            @Override
            public ReceiptHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
                return new ReceiptHolder(layoutInflater, parent);
            }

            @Override
            public void onBindViewHolder(ReceiptHolder holder, int position) {
                Receipt receipt = mReceipts.get(position);
                holder.bind(receipt);
            }

            @Override
            public int getItemCount() {
                return mReceipts.size();
            }
            public void setReceipts(List<Receipt> receipts) {
                mReceipts = receipts;
            }
        }

    }

ReceiptCursorWrapper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import jackg.myreceipts.database.ReceiptDbSchema.ReceiptTable;

public class ReceiptBaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String DATABASE_NAME = "receiptBase.db";
    public ReceiptBaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + ReceiptTable.NAME + "(" +
                " _id integer primary key autoincrement, " +
                ReceiptTable.Cols.UUID + ", " +
                ReceiptTable.Cols.TITLE + ", " +
                ReceiptTable.Cols.DATE + ", " +
                ReceiptTable.Cols.SHOP_NAME + ", " +
                ReceiptTable.Cols.INFO +
                ")"
        );

    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

ReceiptDbSchema:

import android.database.Cursor;
import android.database.CursorWrapper;

import jackg.myreceipts.Receipt;

import java.util.Date;
import java.util.UUID;


public class ReceiptCursorWrapper extends CursorWrapper {
    public ReceiptCursorWrapper(Cursor cursor) {
        super(cursor);
    }
    public Receipt getReceipt() {
        String uuidString = getString(getColumnIndex(ReceiptDbSchema.ReceiptTable.Cols.UUID));
        String title = getString(getColumnIndex(ReceiptDbSchema.ReceiptTable.Cols.TITLE));
        long date = getLong(getColumnIndex(ReceiptDbSchema.ReceiptTable.Cols.DATE));
        String shop_name = getString(getColumnIndex(ReceiptDbSchema.ReceiptTable.Cols.SHOP_NAME));
        String info = getString(getColumnIndex(ReceiptDbSchema.ReceiptTable.Cols.INFO));


        Receipt receipt = new Receipt(UUID.fromString(uuidString));
        receipt.setTitle(title);
        receipt.setDate(new Date(date));
        receipt.setShopName(shop_name);
        receipt.setInfo(info);


        return receipt;
    }
}

我相信我已经正确创建了数据库表,但是不明白为什么会发生错误。 任何帮助将不胜感激。 谢谢,

代码更新2:

ReceiptListFragment:

public class ReceiptDbSchema {
    public static final class ReceiptTable {
        public static final String NAME = "receipts";
        public static final class Cols {
            public static final String UUID = "uuid";
            public static final String TITLE = "title";
            public static final String DATE = "date";
            public static final String SHOP_NAME = "shop_name";
            public static final String INFO = "info";
        }
    }
}

Stages

错误日志:

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;



public class ReceiptListFragment extends Fragment {

    private static final String SAVED_SUBTITLE_VISIBLE = "subtitle";

    private RecyclerView mReceiptRecyclerView;
    private ReceiptAdapter mAdapter;
    private boolean mSubtitleVisible;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_receipt_list, container, false);
        mReceiptRecyclerView = (RecyclerView) view
                .findViewById(R.id.receipt_recycler_view);
        mReceiptRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        if (savedInstanceState != null) {
            mSubtitleVisible = savedInstanceState.getBoolean(SAVED_SUBTITLE_VISIBLE);
        }
        updateUI();
        return view;
    }


    @Override
    public void onResume() {
        super.onResume();
        updateUI();
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_SUBTITLE_VISIBLE, mSubtitleVisible);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_receipt_list, menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.new_receipt:
                Receipt receipt = new Receipt();
                ReceiptLab.get(getActivity()).addReceipt(receipt);
                Intent intent = ReceiptPagerActivity
                        .newIntent(getActivity(), receipt.getId());
                startActivity(intent);
                return true;
            case R.id.help_button:
                Intent intent1 = new Intent(ReceiptListFragment.this.getActivity(), Help.class);
                startActivity(intent1);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }


    }

    private void updateUI() {
        ReceiptLab receiptLab = ReceiptLab.get(getActivity());
        List<Receipt> receipts = receiptLab.getReceipts();
        if (mAdapter == null) {
            mAdapter = new ReceiptAdapter(receipts);
            mReceiptRecyclerView.setAdapter(mAdapter);
        } else {
            mAdapter.setReceipts(receipts);
            mAdapter.notifyDataSetChanged();
        }
    }

    private class ReceiptHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView mTitleTextView;
        private TextView mShopTextView;
        private TextView mDateTextView;
        private TextView mInfoTextView;
        private Receipt mReceipt;

        public ReceiptHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.list_item_receipt, parent, false));
            itemView.setOnClickListener(this);

            mTitleTextView = (TextView) itemView.findViewById(R.id.receipt_title);
            mShopTextView = (TextView) itemView.findViewById(R.id.receipt_shop_name);
            mInfoTextView = (TextView) itemView.findViewById(R.id.receipt_info);
            mDateTextView = (TextView) itemView.findViewById(R.id.receipt_date);
        }

        @Override
        public void onClick(View view) {
            Intent intent = ReceiptPagerActivity.newIntent(getActivity(), mReceipt.getId());
            startActivity(intent);
        }
    }
        private class ReceiptAdapter extends RecyclerView.Adapter<ReceiptHolder> {
            private List<Receipt> mReceipts;

            public ReceiptAdapter(List<Receipt> receipts) {
                mReceipts = receipts;
            }



            public void bind(Receipt receipt, ReceiptHolder holder) {
                holder.mReceipt = receipt;
                holder.mTitleTextView.setText(holder.mReceipt.getTitle());
                holder.mShopTextView.setText(holder.mReceipt.getShopName());
                holder.mInfoTextView.setText(holder.mReceipt.getInfo());
                holder.mDateTextView.setText(holder.mReceipt.getDate().toString());
            }



            @Override
            public ReceiptHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
                return new ReceiptHolder(layoutInflater, parent);
            }

            @Override
            public void onBindViewHolder(ReceiptHolder holder, int position) {
                Receipt receipt = mReceipts.get(position);
                bind(receipt, holder);
            }

            @Override
            public int getItemCount() {
                return mReceipts.size();
            }
            public void setReceipts(List<Receipt> receipts) {
                mReceipts = receipts;
            }
        }

    }

错误日志2:

    --------- beginning of crash
10-23 16:15:06.205 3900-3900/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jackg.myreceipts, PID: 3900
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at jackg.myreceipts.ReceiptListFragment$ReceiptAdapter.bind(ReceiptListFragment.java:140)
        at jackg.myreceipts.ReceiptListFragment$ReceiptAdapter.onBindViewHolder(ReceiptListFragment.java:155)
        at jackg.myreceipts.ReceiptListFragment$ReceiptAdapter.onBindViewHolder(ReceiptListFragment.java:127)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
        at android.view.View.layout(View.java:15671)
        at android.view.ViewGroup.layout(ViewGroup.java:5038)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.C
10-23 16:15:08.080 3900-3900/? I/Process: Sending signal. PID: 3900 SIG: 9

3 个答案:

答案 0 :(得分:1)

解决方案:

在您的Adapter类中编写以下方法:

public void bind(Receipt receipt, ReceiptHolder holder) {
    holder.mTitleTextView.setText(receipt.getTitle());
    holder.mShopTextView.setText(receipt.getShopName());
    holder.mInfoTextView.setText(receipt.getInfo());
    holder.mDateTextView.setText(receipt.getDate().toString());
}

而不是将其写入您的ViewHolder并进行上面显示的更改。

下一步,而不是:

holder.bind(receipt);

写下来

bind(receipt, holder);

尝试一下。希望它能起作用。

答案 1 :(得分:0)

您错过了列数据类型。

vsetdiff

答案 2 :(得分:0)

尝试更改此内容

mTitleTextView = (TextView) itemView.findViewById(R.id.receipt_title);
        mShopTextView = (TextView) itemView.findViewById(R.id.receipt_shop_name);
        mInfoTextView = (TextView) itemView.findViewById(R.id.receipt_info);
        mDateTextView = (TextView) itemView.findViewById(R.id.receipt_date);

对此:

mTitleTextView = (TextView) inflater.findViewById(R.id.receipt_title);
        mShopTextView = (TextView) inflater.findViewById(R.id.receipt_shop_name);
        mInfoTextView = (TextView) inflater.findViewById(R.id.receipt_info);
        mDateTextView = (TextView) inflater.findViewById(R.id.receipt_date);
相关问题