Ваш оператор CREATE TABLE
не включает NOT NULL
для столбца TaskName
, хотя вы говорите, что он определен как NOT NULL
.
Так что это первое несоответствие.
Вы должны изменить эту строку:
+ChallengesEntry.DB_COLUMN + " TEXT , "
до
+ChallengesEntry.DB_COLUMN + " TEXT NOT NULL, "
затем удалите приложение с эмулятора / устройства, чтобы удалить БД
а затем снова запустите приложение, чтобы БД и таблица были воссозданы так, как это должно быть.
Но есть случай, когда таблица уже создана с NOT NULL
для столбца TaskName
, и, возможно, вы внесли изменения в свой код, которые не отражают реальное состояние таблицы ,
Если это так, то есть причина ошибки, которую вы получаете :
У вас есть 2 разных метода:
insertTask()
и insertDay()
для вставки данных в вашу таблицу! Почему?
Это означает, что каждая строка вашей таблицы будет иметь идентификатор и только 1 столбец с данными,
другая будет пустой (null
).
Это то, что вы хотите? Я так не думаю.
Так что если столбец TaskName
определен NOT NULL
и вы выполните insertDay()
,
тогда вы получите ошибку, потому что TaskName
в этой строке не имеет значения (это ноль)
и это не разрешено .
Получите данные из EditText
и AlertDialog
и сохраните его в таблице с 1 оператором вставки, например:
public boolean insertData(String taskName, String days){
DbHelper mDbHelper = new DbHelper(this);
SQLiteDatabase db = mDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ChallengesEntry.DB_COLUMN,taskName);
values.put(ChallengesEntry.DB_COLUMN_DAYS,days);
boolean result = db.insert(ChallengesEntry.DB_TABLE, null, values) >= 0;
db.close();
return result;
}
Этот метод возвращает true
или false
, если вставка прошла успешно.
Вы можете назвать это так:
boolean successful = insertData(taskName, days);
, где taskname
и days
- это значения, которые вы собрали из EditText
и AlertDialog
.
Редактировать
Объявите эту переменную в своем классе деятельности:
long taskId = 0;
Этот метод вставит имя задачи:
private long insertTask(){
String name = editChallengeName.getText().toString().trim();
if (name.isEmpty())
return -1;
DbHelper mDbHelper = new DbHelper(this);
SQLiteDatabase db = mDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ChallengesEntry.DB_COLUMN, name);
long id = db.insert(ChallengesEntry.DB_TABLE, null, values);
db.close();
return id;
}
Вы называете это там, где у вас было insertTask();
:
taskid = insertTask();
тогда этот метод обновит строку с id = taskid:
private void insertDay(String task) {
DbHelper mDbHelper = new DbHelper(this);
SQLiteDatabase db = mDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ChallengesEntry.DB_COLUMN_DAYS, task );
db.update(ChallengesEntry.DB_TABLE, values, ChallengesEntry.DB_COLUMN + "=" + taskid, null);
db.close();
}
и вы называете это так же, как вы называли предыдущий insertDay()