Android阻止app在启动时查询空数据库

时间:2015-06-26 12:15:32

标签: java android sqlite

我正在构建一个简单的待办事项/任务应用程序,其中任务以循环器/卡视图布局呈现,并且在选择任务时,用户被视为该特定任务的“详细”视图。我正在使用Genymotion模拟器测试我的应用程序。我的问题是应用程序在启动时立即崩溃了NPE。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.api.client.util.DateTime.toString()' on a null object reference
            at com.github.idclark.forgetmenot.TaskAdapter.onBindViewHolder(TaskAdapter.java:35)
            at com.github.idclark.forgetmenot.TaskAdapter.onBindViewHolder(TaskAdapter.java:17)

虽然我不完全确定,但我认为这是因为我还没有在数据库中输入任何数据。首先从我的Main活动膨胀的片段中查询数据库。

public static class PlaceholderFragment extends Fragment {

        Activity mActivity;
        RecyclerView mRecyclerView;
        TaskAdapter taskAdapter;
        AddFloatingActionButton mFabView;
        CheckBox mCheckBox;

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            mRecyclerView = (RecyclerView) rootView.findViewById(R.id.cardList);
            mFabView = (AddFloatingActionButton) rootView.findViewById(R.id.normal_plus);

            mFabView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent createTaskIntent = new Intent(v.getContext(), EditActivity.class);
                    startActivity(createTaskIntent);
                }
            });

            taskAdapter = new TaskAdapter(new TaskTableController(getActivity()).getAllTasksForUser());
            return rootView;
        }

我的TaskAdapter需要ArrayList<Task>

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {

    private List<Task> taskList;
    OnItemClickListener mItemClickListener;

    public TaskAdapter(List<Task> taskList) {
        this.taskList = taskList;
    }

    @Override
    public int getItemCount() {
        return taskList.size();
    }

    @Override
    public void onBindViewHolder(TaskViewHolder taskViewHolder, int i) {
        Task task = taskList.get(i);
        taskViewHolder.mTitle.setText(task.getTitle());
        taskViewHolder.mUpdated.setText(task.getUpdated().toString());
        if (task.getStatus().equals("completed")) {
            taskViewHolder.mStatus.setChecked(true);
        } else taskViewHolder.mStatus.setChecked(false);

    }

    @Override
    public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View itemView = LayoutInflater.from(viewGroup.getContext()).
                inflate(R.layout.tasklist_layout, viewGroup, false);

        return new TaskViewHolder(itemView);
    }

对数据库的实际查询类似于

public List<Task> getAllTasksForUser() {
        final String QUERY_ALL_RECORDS = "SELECT * FROM " + TaskEntry.TABLE_NAME;

        List<Task> taskList = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(QUERY_ALL_RECORDS, null);
        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                Task task = new Task();
                int TaskId = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_ID);
                task.setId(cursor.getString(TaskId));
                task.setTitle(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE)));
                task.setDue(new DateTime(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DUE))));
                task.setNotes(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_NOTES)));
                taskList.add(task);
            }
        } else return taskList;
        db.close();
        return taskList;
    }

当应用程序首次安装在模拟器上时,数据库中没有数据,我认为这是导致NPE的原因。我如何处理这种情况,以便如果没有数据我的片段只显示一个空列表(即空白)。我已经检查cursor.getCount()是否大于0,如果它没有向适配器返回一个空列表。我错过了什么来摆脱这个NPE?

1 个答案:

答案 0 :(得分:2)

崩溃最有可能发生在以下一行:

    taskViewHolder.mUpdated.setText(task.getUpdated().toString());

task.getUpdate()返回null,您的应用崩溃了。 我不知道你在哪里调用setUpdated。可能是你的一个安装者做了那个,或者你可能忘记在你的代码中放置一个setter。

有点不相关的说明:如果您的任务列表为空,则不要关闭光标和数据库。