Почему, когда я вставляю значения в базу данных SQLite, они устанавливаются в null? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь создать приложение со списком задач.Я запускаю приложение и вставляю значения через EditText в базу данных SQLite, но когда я открываю его, значения устанавливаются в ноль.Что я делаю не так?

Это действия:

1.Database

DatabaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "taskdb";
    private static final int DATABASE_VERSION = 1;

    private static final String TABLE_TASKS = "tasks";
    private static final String KEY_TASK_ID = "_id";
    private static final String KEY_TASK_NAME = "name";
    private static final String KEY_TASK_DATE = "date";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                KEY_TASK_NAME + " TEXT," + KEY_TASK_DATE + " TEXT" + ")";
        db.execSQL(CREATE_TASKS_TABLE);}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS tasks" + TABLE_TASKS);
        onCreate(db);
    }

    public void addTask(Task task) {
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(KEY_TASK_NAME, task.getTaskName());
        values.put(KEY_TASK_DATE, task.getTaskDate());

        db.insert(TABLE_TASKS, null, values);
        db.close();
    }

    public ArrayList<Task> getAllTasks() {
        String[] columns = {
                KEY_TASK_ID,
                KEY_TASK_NAME,
                KEY_TASK_DATE};
        ArrayList<Task> taskList = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_TASKS,
                columns,
                null, null, null, null, null);
        if(cursor != null) {
            cursor.moveToFirst();
             do {
                 Task task = new Task(
                         parseInt(cursor.getString(0)),
                         cursor.getString(1),
                         cursor.getString(2));
                taskList.add(task);
            }
            while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
        return taskList;
    }
}

2.Деятельность, в которой яиметь EditText

AddTaskActivity.java

public class AddTaskActivity extends AppCompatActivity {
    TextView addNewTask, setStartTime, setEndTime;
    EditText addTaskName;
    TimePicker timePicker1, timePicker2;
    int hour1, minute1;
    int hour2, minute2;
    String theNewTask;
    Button addTaskButton;
    TasksListActivity tla;
    DatabaseHandler dth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_task);
        dth = new DatabaseHandler(this);
        addNewTask = findViewById(R.id.addNewTask);
        setStartTime = findViewById(R.id.setStartTime);
        setEndTime = findViewById(R.id.setEndTime);
        addTaskName = findViewById(R.id.addTaskName);
        timePicker1 = findViewById(R.id.timePicker1);
        timePicker2 = findViewById(R.id.timePicker2);
        addTaskButton = findViewById(R.id.addTaskButton);

        addTaskButton.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String name = addTaskName.getText().toString();
                        Task task = new Task();
                        task.setTaskName(name);
                        task.setTaskDate("date");

                        dth.addTask(task);

                        Intent intent = new Intent(AddTaskActivity.this, TasksListActivity.class);
                        startActivity(intent);
                    }
                }
        );
    }
}

3.Объект класса

Task.java

public class Task  {
    String tTaskName, tTaskDate;
    int ID;
    public Task(int ID, String tTaskName, String tTaskDate){
        this.tTaskName = tTaskName;
        this.tTaskDate = tTaskDate;
        this.ID =ID;
    }
    public Task(){}

    // Getters and setters for all attributes
}

4.Адаптер для RecyclerView

TaskAdapter.java

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.ViewHolder> {
    private ArrayList<Task> tasksList;
    private Context mContext;

    public TaskAdapter(ArrayList<Task> tasksList, Context mContext){
        this.tasksList = tasksList;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.task_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Task stringTask = tasksList.get(position);
        holder.taskText.setText(stringTask.getTaskName());
        holder.dateText.setText(stringTask.getTaskDate());
    }

    @Override
    public int getItemCount() {
        return tasksList == null ? 0:tasksList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        View view1;
        TextView taskText, dateText;
        RelativeLayout relativeLayout;

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

            view1 = itemView.findViewById(R.id.view1);
            taskText = itemView.findViewById(R.id.taskTextView);
            dateText = itemView.findViewById(R.id.dateTextView);
            relativeLayout = itemView.findViewById(R.id.recyclerView);
        }
    }
}

5.Деятельность, в которой должны отображаться данные

TasksListActivity.java

public class TasksListActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    TaskAdapter taskAdapter;
    LinearLayoutManager layoutManager;
    ArrayList<Task> tasksList;
    DatabaseHandler dth;


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

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.taskListItem:
                        Intent intent1 = new Intent(TasksListActivity.this, TasksListActivity.class);
                        startActivity(intent1);
                        break;
                    case R.id.addTasks:
                        Intent intent5 = new Intent(TasksListActivity.this, AddTaskActivity.class);
                        startActivity(intent5);
                        break;
                    case R.id.noteListItem:
                        Intent intent2 = new Intent(TasksListActivity.this, NotesListActivity.class);
                        startActivity(intent2);
                        break;
                }
                return true;
            }
        });

        recyclerView = findViewById(R.id.recyclerView);

        tasksList = new ArrayList<>();
        taskAdapter = new TaskAdapter(tasksList, TasksListActivity.this);
        layoutManager = new LinearLayoutManager(getApplicationContext());
        dth = new DatabaseHandler(this);

        recyclerView.setHasFixedSize(true);

        getDataFromSQLite();

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(taskAdapter);
    }

    private void getDataFromSQLite() {
        // AsyncTask is used that SQLite operation not blocks the UI Thread.
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                tasksList.clear();
                tasksList.addAll(dth.getAllTasks());

                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                taskAdapter.notifyDataSetChanged();
            }
        }.execute();
    }
}

1 Ответ

0 голосов
/ 13 мая 2019

Я полагаю, что ваша проблема связана с классом Task в том, что вы не используете переданные значения для методов set для установки значений объекта, а вместо этого вы используете unset values ​​для самостоятельной установки.

Ваш Task.java должен быть (см. Комментарии): -

public class Task  {
    String tTaskName, tTaskDate;
    int ID;
    public Task(int ID, String tTaskName, String tTaskDate){
        this.tTaskName = tTaskName;
        this.tTaskDate = tTaskDate;
        this.ID =ID;
    }
    public Task(){}
    public void setID(int i){
        //this.ID = ID; //<<<<<<<<<<WRONG will set to null
        this.ID = i; //<<<<<<<<<<Correct sets the value to the value that was passed (albeit not contributing to the problem)
    }
    public int getID(){
        return ID;
    }
    public void setTaskName(String name){
        //this.tTaskName = tTaskName; //<<<<<<<<<<WRONG will set to null
        this.tTaskName = name; //<<<<<<<<<<Correct sets the value to the value that was passed
    }
    public String getTaskName(){
        return tTaskName;
    }
    public void setTaskDate(String the_date){
        //this.tTaskDate = tTaskDate; //<<<<<<<<<<WRONG will set to null
        this.tTaskDate = the_date; //<<<<<<<<<<Correct sets the value to the value that was passed
    }
    public String getTaskDate(){
        return tTaskDate;
    }
}

Кроме того, ваш код не будет компилироваться из-за KEY_ID , а не KEY_TASK_ID кодируется согласно: -

//String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + //<<<<<<<<<<ERROR 1
        String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "(" + KEY_TASK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                KEY_TASK_NAME + " TEXT," + KEY_TASK_DATE + " TEXT" + ")";
  • Закомментированная строка является ошибочной строкой согласно комментарию.

Следующееиспользовался для проверки вышеизложенного (в качестве примера отладки с использованием системного журнала (этого было достаточно, чтобы найти проблему)): -

public class MainActivity extends AppCompatActivity {

    DatabaseHandler mDBHndlr;

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

        mDBHndlr = new DatabaseHandler(this);
        Task tasktoadd = new Task();
        tasktoadd.setTaskName("Test001");
        tasktoadd.setTaskDate("2019-01-01");
        mDBHndlr.addTask(tasktoadd);
        ArrayList<Task> tasklist = mDBHndlr.getAllTasks();
        for (Task task: tasklist) {
            Log.d("MYTASKTEST","Task name is " + task.getTaskName() + " Date is " + task.getTaskDate());
        }
    }
}

Вывод в журнал при применении изменений:-

2019-05-14 06:14:52.458 5758-5758/? D/MYTASKTEST: Task name is Test001 Date is 2019-01-01

(вместо 2019-05-14 06:14:52.458 5758-5758/? D/MYTASKTEST: Task name is null Date is null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...