2011-10-08 22 views
15

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.

Respuesta

42

Los errores típicos son los siguientes:

  • Usted está tratando de insertar null valores para las columnas que son la restricción de ser no null (lo que tal vez se perdió para establecer los valores, tal vez incluso a causa de la columna equivocada constante definición) .
  • vas a insertar mismo valor para una columna que se declara único (típica columna de clave principal)
  • Se establece valores de tipo incorrecto de inserción (por ejemplo, la columna es integer pero se estableció un string)

Creo que olvidó configurar CHECKED, por lo que es null y viola la restricción not null.

+0

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

+0

Lo siento, de alguna manera me perdí esas constantes ... Actualicé mi respuesta. – Knickedi

+0

tiene toda la razón, se olvidó de agregar la marcada ya que no se ingresó. ¡Gracias! – Rebecca

Cuestiones relacionadas