InsertWithOnConflict () vs. Insertar o reemplazar

Estaba refactorizando mi código y reemplazando todas las instrucciones insert con insert or replace while encontré el siguiente método que usa db.insert() lugar de una sentencia preparada:

 public static void insertIntoTableByNameAndFieldsAndValues( String tableName, String[] fields, String[] values, Context c) throws FieldsAndValuesMismatchException, UnrecognizedTypeException { DatabaseAbstractionLayer dal = new DatabaseAbstractionLayer(c); SQLiteDatabase db = dal.getWritableDatabase(); ContentValues con = new ContentValues(); if (fields.length != values.length) throw new FieldsAndValuesMismatchException( "fieldsString and values are not the same size"); int fieldCount = fields.length; for (int i = 0; i < fieldCount; i++) { String[] fieldArr = fields[i].split(":"); String value = values[i]; if (fieldArr[1].equalsIgnoreCase("long")) { // long if(value.equalsIgnoreCase("null")){ con.putNull(fieldArr[0]); }else{ con.put(fieldArr[0],(long) Integer.parseInt(value)); } } else if (fieldArr[1].equalsIgnoreCase("string") || fieldArr[1].equalsIgnoreCase("text")) { // string if(value.equalsIgnoreCase("null")){ con.putNull(fieldArr[0]); }else{ con.put(fieldArr[0], value); } }else if(fieldArr[1].equalsIgnoreCase("double")){ //double if(value.equalsIgnoreCase("null")){ con.putNull(fieldArr[0]); }else{ con.put(fieldArr[0], Double.valueOf(value)); } } else { throw new UnrecognizedTypeException(fieldArr[1] + " is not string,text, long or double"); } } db.insert(tableName, null, con); db.close(); } 

No quiero volver a escribir el código y utilizar una consulta en bruto. ¿Existe una manera de reemplazar una fila cuando se produce un conflicto? Supongo que insertWithOnConflict() lo haría pero no pude encontrar un buen ejemplo.

Yup, (cambie BaseColumns._ID a algo adecuado si no sigue el nombre estándar del identificador de fila utilizado por Android) y esto debería hacer lo que quiera:

 db.insertWithOnConflict(tableName, BaseColumns._ID, v, SQLiteDatabase.CONFLICT_REPLACE); 

Pero – ese método seguro hace un montón de cosas inútiles. En resumen, podría reducirse a esto:

 public static void insertIntoTableByNameAndFieldsAndValues( String tableName, String[] fields, String[] values, Context c) throws FieldsAndValuesMismatchException { if (fields.length != values.length) { throw new FieldsAndValuesMismatchException( "fields[] and values[] are not the same length"); } ContentValues v = new ContentValues(); // You really don't need to distinguish between integers, doubles // etc. etc. - SQLite is type agnostic, just dumping Strings from Java // will work just fine - the *only* point in converting stuff is to check // the format prior to inserts. // Using "null" as the null identifier is also pointless. Pass actual null // values instead - calling #putNull("somecolumn") is the same // as #put("somecolumn", null) for (int i = 0; i < fields.length; i++) { v.put(fields[i], values[i]); } db.insertWithOnConflict(tableName, BaseColumns._ID, v, SQLiteDatabase.CONFLICT_REPLACE); } 
  • Acceda a la base de datos en una clase que no sea de actividad
  • ¿Cómo medir el tamaño de los datos de las aplicaciones de Android e identificar las fugas de almacenamiento?
  • ¿Es posible aplicar la clave principal en los campos de texto en la base de datos android
  • Excepción no manipulada org.json.jsonexception
  • Tratar con WHERE IN (?) En la consulta de SQLite de SQL
  • Cómo guardar imágenes en la base de datos
  • Problema de almacenamiento de datos de Android
  • Establecer un valor predeterminado en una columna en SQLite
  • Error No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
  • Acerca de la seguridad de Sqlite en android en caso de varios procesos
  • Android SQLite ORDER BY no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.