实施SQLite数据库后,我的Recyclerview列表停止工作

时间:2017-07-28 01:21:14

标签: java android database sqlite android-recyclerview

我正在构建待办事项列表应用。我正在学习SQLite数据库,我正在尝试将用户输入保存到SQLite数据库表中,并将其显示在我的recyclerview列表中。当我在没有SQLite的情况下执行此操作时,它的工作原理显然是我的数据库表的实现。应用程序应该按按钮单击将数据添加到列表中:

var numbers = [0,1,2,3,4,5];
var evens = [];
var odds = [];

function isEvenOrNot(getEven) {
    return function(num) {
        if (num % 2 == 0 || num == 0){
            return true;
        }
        return false;
    }
}

evens = numbers.filter(isEvenOrNot(true));
odds = numbers.filter(isEvenOrNot(false));

console.log(evens); // [0,2,4]
console.log(odds); // [1,3,5]

但现在却没有那样做。该应用程序不会崩溃。问题只是我的列表显示绝对没有数据。以下是我的相关Java文件:

MainActivity.java

addingItems.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(itemsInput.getText() != null){
                    items.add(new todo(itemsInput.getText().toString()));
                    itemsInput.setText("");
                }else {
                    Toast.makeText(MainActivity.this, "Please enter something to do", Toast.LENGTH_SHORT).show();
                }
                itemAdapter.notifyDataSetChanged();
            }
        });

我的自定义适配器:

public class MainActivity extends AppCompatActivity {

    private SQLiteDatabase sqLiteDatabase;
    private List<todo> items = new ArrayList<>();
    private ItemAdapter itemAdapter;
    private RecyclerView listItemsRecyclerView;
    EditText itemsInput;
    Button addingItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        itemsInput = (EditText)findViewById(R.id.to_do_editText);
        addingItems = (Button)findViewById(R.id.to_do_btn);
        listItemsRecyclerView = (RecyclerView) findViewById(R.id.to_do_list);

        ToDoListDatabaseHelper databaseHelper = new ToDoListDatabaseHelper(this);
        sqLiteDatabase = databaseHelper.getWritableDatabase();

        items = new ArrayList<>();
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        listItemsRecyclerView.setLayoutManager(layoutManager);
        listItemsRecyclerView.setItemAnimator(new DefaultItemAnimator());;
        itemAdapter = new ItemAdapter(items);
        listItemsRecyclerView.setAdapter(itemAdapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

            }
        });

        addingItems.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(itemsInput.getText().length() > 0){
                    addNewToDo(itemsInput.getText().toString());
                    itemsInput.setText("");
                }else {
                    Toast.makeText(MainActivity.this, "Please enter something to do", Toast.LENGTH_SHORT).show();
                }
                itemAdapter.notifyDataSetChanged();
            }
        });
    }

    private List<todo> getAllToDos(){
        Cursor cursor = sqLiteDatabase.rawQuery("select * from " + ToDoContract.ToDoEntry.TABLE_NAME, new String[]{});
        List<todo> todos = new ArrayList<>();
        todo todo;
        if (cursor != null && cursor.getCount() > 0) {
            if (cursor.moveToFirst()) {
                do {

                    String name = cursor.getString(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_NAME));
                    int priority = cursor.getInt(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_PRIORITY));
                    int timestamp = cursor.getInt(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_TIMESTAMP));
                    todo = new todo(name);
                    todos.add(todo);
                } while (cursor.moveToNext());
            }
            cursor.close();
        }
        return todos;
    }

    private long addNewToDo(String name){
        ContentValues cv = new ContentValues();
        cv.put(ToDoContract.ToDoEntry.COLUMN_TODO_NAME, name);
        return sqLiteDatabase.insert(ToDoContract.ToDoEntry.TABLE_NAME, null, cv);
    }
}

我在我的SQLite类上运行了单元测试,因此它们没有问题。

2 个答案:

答案 0 :(得分:1)

您不应该使用Cursor作为Adapter的数据源。为什么不从光标获取数据(todos)然后将数据放入Adapter?众所周知,在数据读取结束时,光标应为 CLOSED 。你应该这样编码:

private List<todo> getAllToDos() {
    Cursor cursor = sqLiteDatabase.rawQuery("select * from " + ToDoContract.ToDoEntry.TABLE_NAME, new String[]{});
    List<todo> todos = new ArrayList<>();
    todo todo;
    if (cursor != null && cursor.getCount() > 0) {
        if (cursor.moveToFirst()) {
            do {

                String name = cursor.getString(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_NAME));
                int priority = cursor.getInt(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_PRIORITY));
                int timestamp = cursor.getInt(cursor.getColumnIndex(ToDoContract.ToDoEntry.COLUMN_TODO_TIMESTAMP));
                todo = new todo(name);
                todo.setPriority(priority);
                todo.setTimestamp(timestamp);
                todos.add(todo);
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
    return todos;
}

您的ItemAdapter会更简单。

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    private List<todo> todoList;

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView toDoTextView;

        public ViewHolder(View itemView) {
            super(itemView);

            toDoTextView = (TextView) itemView.findViewById(R.id.to_do);
        }
    }

    public ItemAdapter(List<todo> todoList) {
        this.todoList = todoList;
    }

    @Override
    public ItemAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ItemAdapter.ViewHolder holder, int position) {
        todo toDo = todoList.get(position);
        holder.toDoTextView.setText(toDo.getToDo());
    }


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

还有一些其他的变化。但我认为你可以解决它们,就像我上面告诉你的那样。如果你有任何其他问题,请告诉我。我会帮助你。

答案 1 :(得分:0)

试试这个

public void update()
{
    cursor.requery();
    notifyDataSetChanged();
}