SQLiteConstraintException: NOT NULL ограничения для Android - PullRequest
0 голосов
/ 11 января 2019

У меня есть активность редактора, где я вставляю свои данные в базу данных.

Я создал 3 столбца как: -

  • ID INTEGER ,
  • Задание TEXT NOT NULL и
  • Дни ТЕКСТ .

Я вставляю данные в столбец Task с данными из текста редактирования и вставляю другие данные в столбец Days , создавая диалоговое окно с предупреждением, содержащим текст редактирования.

Я успешно могу вставить данные в столбец Task , но когда я вставляю данные из диалогового окна предупреждения в столбец Days , я получаю эту ошибку: -

"android.database.sqlite.SQLiteConstraintException: NOT NULL ограничение не выполнено: Task.TaskName (код 1299) ".

Пожалуйста, помогите мне с этим. Я знаю, что есть тот же самый вопрос, но android studio мало помогает в отладке базы данных sq lite, а также ошибки разные для всех, помните, что, пожалуйста, не отмечайте этот вопрос как дубликат.

ЭТО МОЙ СИНТАКСИС СОЗДАНИЯ SQLITE

  public void onCreate(SQLiteDatabase db) {

        String query= "CREATE TABLE " + ChallengesEntry.DB_TABLE  + " ("
                +ChallengesEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                +ChallengesEntry.DB_COLUMN + " TEXT , "
                +ChallengesEntry.DB_COLUMN_DAYS + " TEXT);";

        db.execSQL(query);
    }

ЭТО МОЙ РЕДАКТОРСКИЙ КЛАСС ДЕЯТЕЛЬНОСТИ

  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_save:
                insertTask();
                // Exit activity
                finish();
                return true;

            case android.R.id.home:
                // Navigate back to parent activity (CatalogActivity)
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }

        return super.onOptionsItemSelected(item);

    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:

                final EditText editText =  new EditText(this);
                AlertDialog dialog = new AlertDialog.Builder(this)
                        .setTitle("Add new Challenge")
                        .setMessage("Whats your Challenge")
                        .setView(editText)
                        .setPositiveButton("Add", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String task = String.valueOf(editText.getText());
                                insertDay(task);
                            }
                        })
                        .setNegativeButton("CANCEL", null)
                        .create();
                dialog.getWindow().getAttributes().windowAnimations=R.style.DialogAnimation;
                dialog.show();


        }

    }
    //TEMPORARY SOLUTION
    public 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.insertWithOnConflict(ChallengesEntry.DB_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
        db.close();

    }

    public void insertTask(){

        String name=editChallengeName.getText().toString().trim();
        DbHelper mDbHelper = new DbHelper(this);
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(ChallengesEntry.DB_COLUMN,name);
        db.insertWithOnConflict(ChallengesEntry.DB_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
        db.close();

    }

1 Ответ

0 голосов
/ 11 января 2019

Ваш оператор 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()

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