He visto algunas otras preguntas sobre esto, pero ninguna de las respuestas realmente parecía funcionar para mi código. Obtengo un error 'SQLiteConstraintException: código de error 19: restricción fallida' cuando intento insertarlo en mi base de datos. Aquí está el código para la operación de inserción. db.insert devuelve -1 en este momento, lo que lleva al mensaje "no se pudo insertar".SQLiteConstraintException: código de error 19: error de la restricción - Error de Android
Aquí está el código de proveedor de contenido relevante:
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;
}
Este es el código pertinente del manifiesto de Android:
<provider android:name="DBProvider"
android:authorities="com.oliverapps.provider.DB" />
Y aquí está el código en cuestión que llama al método de inserción anterior:
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);
¿Alguna pista de por qué esto no está funcionando? Esto es principalmente código de un libro de Android que tengo, modificado a mi propia base de datos.
El código DATABASE_CREATE está en el código del proveedor de contenido anterior ... en cuanto a las otras notas ... Estoy literalmente ingresando mis propios datos, entonces sé que no hay valores nulos, he comprobado los valores ingresados durante la depuración a asegúrese de que se estén ingresando las cuerdas correctas. Creo que he guardado todas mis columnas como cadenas, por lo que no es necesario realizar ninguna conversión de cadena a entero o doble. Y el único valor único aquí debería ser el _id, que no ingreso yo mismo (creo que el DB automáticamente me lo pondrá a uno ... si estoy equivocado en esto POR FAVOR, hágamelo saber) ... ¿algún otro pensamiento? – Rebecca
Lo siento, de alguna manera me perdí esas constantes ... Actualicé mi respuesta. – Knickedi
tiene toda la razón, se olvidó de agregar la marcada ya que no se ingresó. ¡Gracias! – Rebecca