SQLiteConstraintException: codice di errore 19: vincolo non riuscito – errore Android

Ho visto alcune altre domande su questo, ma nessuna delle risposte sembrava funzionare correttamente per il mio codice. Ricevo un errore ‘SQLiteConstraintException: errore codice 19: vincolo non riuscito’ quando provo a inserire nel mio DB. Ecco il codice per l’operazione di inserimento. db.insert restituisce ora un -1, che porta al messaggio “imansible inserire”.

Ecco il codice del Content Provider pertinente:

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; } 

Ecco il codice relativo da Android Manifest:

   

E qui è il codice rilevante che chiama il metodo di inserimento sopra:

 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); 

Qualche idea sul perché questo non funziona? Questo è principalmente il codice di un libro Android che ho, modificato nel mio database.

Gli errori tipici sono i seguenti:

  • Stai tentando di inserire valori null per le colonne che non sono null per il vincolo (quindi forse mancano i valori impostati, forse anche a causa della definizione di una costante di colonna sbagliata).
  • Stai inserendo lo stesso valore per una colonna dichiarata univoca (tipica colonna chiave primaria)
  • Si impostano valori di tipo errato per l’inserimento (ad es. La colonna è integer ma si imposta una string )

Penso che ti sei dimenticato di impostare CHECKED quindi è null e viola il vincolo not null .