SQLiteConstraintException: код ошибки 19: ограничение не выполнено - PullRequest
2 голосов
/ 20 мая 2011

Начинающий здесь снова хочет совета.Попытка следовать учебнику для добавления / редактирования / удаления данных в / из базы данных.

Однако при попытке добавить новый заголовок я получаю следующую ошибку:

ERROR/Database(278): Error inserting Book_Title=testtitle Book_Author=testauthor

ERROR/Database(278): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

Я подозреваю, что это противоречит идентификатору, так как база данных уже создана в предыдущем классефайл.Однако я не достаточно опытен с Java, чтобы знать, как это исправить.Редактирование и удаление данных работают нормально.

Некоторый код:

DatabaseManager.class:

public void addRow(String rowStringOne, String rowStringTwo)
    {
        // this is a key value pair holder used by android's SQLite functions
        ContentValues values = new ContentValues();


        values.put(TABLE_ROW_ONE, rowStringOne);
        values.put(TABLE_ROW_TWO, rowStringTwo);


        // ask the database object to insert the new data 
        try{db.insert(TABLE_NAME, null, values);}
        catch(Exception e)
        {
            Log.e("DB ERROR", e.toString());
            e.printStackTrace();
        }
    }



private class CustomSQLiteOpenHelper extends SQLiteOpenHelper
    {



        public CustomSQLiteOpenHelper(Context context)
        {
            super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            // This string is used to create the database.  It should
            // be changed to suit your needs.
            String newTableQueryString = "create table " +
                                        TABLE_NAME +
                                        " (" +
                                        TABLE_ROW_ID + " integer primary key autoincrement not null," +
                                        TABLE_ROW_ONE + " text," +
                                        TABLE_ROW_TWO + " text" +
                                        ");";




            // execute the query string to the database.
            db.execSQL(newTableQueryString);

        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            // NOTHING TO DO HERE. THIS IS THE ORIGINAL DATABASE VERSION.
            // OTHERWISE, YOU WOULD SPECIFIY HOW TO UPGRADE THE DATABASE.
        }
    } 
}

AddData.class:

private void addRow()
{
    try
    {
        // ask the database manager to add a row given the two strings
        db.addRow
        (

                textFieldOne.getText().toString(),
                textFieldTwo.getText().toString()

        );

        // request the table be updated
        updateTable();

        // remove all user input from the Activity
        emptyFormFields();
    }
    catch (Exception e)
    {
        Log.e("Add Error", e.toString());
        e.printStackTrace();
    }
}

Ответы [ 3 ]

0 голосов
/ 05 мая 2012

Попробуйте удалить и воссоздать вашу базу данных.

Я не вижу ничего плохого в вашем коде, я подозреваю изменение в определении таблицы, которое делает базу данных и код несинхронными

(мой код с sqlite НЕ заканчивается точкой с запятой; вы тоже можете попробовать это)

0 голосов
/ 16 декабря 2013

Независимо от того, нашли ли вы или не нашли решения для решения проблемы с ограничениями, я предложу вам внедрить поставщика контента для вашей таблицы. Если вы понятия не имеете о ContentProviders, я публикую здесь ссылку на начало работы с тем же.

http://www.grokkingandroid.com/android-tutorial-writing-your-own-content-provider/

Надеюсь, вы найдете решение здесь. Удачи

0 голосов
/ 20 мая 2011

Вам говорят, что вы хотите вставить запись, которую нельзя вставить из-за ограничений первичного или внешнего ключа / ключей. Скорее всего, вы хотите вставить запись с ID, которая уже была в таблице.
В AFIIK SQLIte нет ключевого слова autoincrement, но в любой таблице есть атрибут _ID, я рекомендую использовать его в качестве автоинкремента первичного ключа вместо создания собственного.

Исключение возникает из-за того, что вы не вставляете свой первичный ключ, и он не является автоинкрементом, как вы предполагаете.

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