SQLiteConstraintException: код ошибки 19: ограничение не выполнено – ошибка Android

Я видел некоторые другие вопросы об этом, но ни один из ответов действительно не работал для моего кода. Я получаю сообщение об ошибке SQLiteConstraintException: ошибка 19: сбой при попытке вставить в мою БД. Вот код для операции вставки. Db.insert возвращает -1 прямо сейчас, что приводит к сообщению «не удалось вставить».

Вот соответствующий код поставщика контента:

public static final String PROVIDER_NAME = "com.oliverapps.provider.DB"; public static final Uri CONTENT_URI = Uri.parse("content://"+ PROVIDER_NAME + "/tasks"); public static final String _ID = "_id"; public static final String CATEGORY = "category"; public static final String STORE = "store"; public static final String DESCRIPTION = "description"; public static final String DISTANCE = "distance"; public static final String CHECKED = "checked"; private static final int KEY_CATEGORY = 1; private static final int KEY_STORE = 2; private static final int KEY_DESCRIPTION = 3; private static final int KEY_DISTANCE = 4; private static final int KEY_CHECKED = 5; private static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "category", KEY_CATEGORY); uriMatcher.addURI(PROVIDER_NAME, "category/store", KEY_STORE); uriMatcher.addURI(PROVIDER_NAME, "category/store/description", KEY_DESCRIPTION); uriMatcher.addURI(PROVIDER_NAME, "category/store/description/distance", KEY_DISTANCE); uriMatcher.addURI(PROVIDER_NAME, "checked", KEY_CHECKED); } //---for database use--- private SQLiteDatabase tasksDB; private static final String DATABASE_NAME = "tasks"; private static final String DATABASE_TABLE = "tasks" + ""; private static final int DATABASE_VERSION = 1; private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (" + _ID + " integer primary key autoincrement, " + CATEGORY + " text not null, " + STORE + " text not null, " + DESCRIPTION + " text, " + DISTANCE + " text not null, " + CHECKED + " text not null);"; private static class DatabaseHelper extends SQLiteOpenHelper{ DatabaseHelper(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db){ db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ Log.w("Content provider database", "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); onCreate(db); } } @Override public Uri insert(Uri uri, ContentValues values){ //---add a new task--- long rowID = tasksDB.insert(DATABASE_TABLE, "", values); //---if added successfully--- if(rowID > 0){ Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to insert row into " + uri); } @Override public boolean onCreate(){ Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); tasksDB = dbHelper.getWritableDatabase(); return (tasksDB == null)? false:true; } 

Вот соответствующий код из манифеста Android:

  <provider android:name="DBProvider" android:authorities="com.oliverapps.provider.DB" /> 

И вот соответствующий код, который вызывает метод вставки выше:

 ContentValues values = new ContentValues(); values.put(DBProvider.CATEGORY, category); values.put(DBProvider.STORE, store); values.put(DBProvider.DESCRIPTION, description); values.put(DBProvider.DISTANCE, distance); Uri uri = getContentResolver().insert(DBProvider.CONTENT_URI, values); 

Любая подсказка, почему это не работает? Это в основном код из книги Android, которую я имею, измененный для моей собственной базы данных.

Solutions Collecting From Web of "SQLiteConstraintException: код ошибки 19: ограничение не выполнено – ошибка Android"

Типичные ошибки следующие:

  • Вы пытаетесь вставить null значения для столбцов, ограничения которых не равны null (поэтому, возможно, пропустили значение, возможно, даже из-за неправильного определения константы столбца).
  • Вы вставляете одно и то же значение для столбца, который объявляется уникальным (типичный столбец первичного ключа)
  • Вы устанавливаете значения неправильного типа для вставки (например, столбец integer но вы устанавливаете string )

Я думаю, вы забыли установить CHECKED чтобы он был null и CHECKED not null ограничение.