Introducción
Esto se basa en Java de Android y es un buen ejemplo de cómo cambiar la base de datos sin molestar a los fanáticos / clientes de la aplicación. Esto se basa en la idea de la página de preguntas frecuentes de SQLite
http://sqlite.org/faq.html#q11
El problema
No me di cuenta de que necesitaba establecer un número de fila o id_registro para eliminar un solo artículo comprado en un recibo y, al mismo tiempo, el número de código de barras del artículo me engañó para que pensara en hacerlo como la clave para eliminar ese artículo. Estoy guardando los detalles de un recibo en la tabla recibo_barco Dejarlo sin un record_id puede significar eliminar todos los registros del mismo artículo en un recibo si utilicé el código de barras del artículo como clave.
aviso
Por favor, comprenda que esta es una copia y pegado de mi código en el que estoy trabajando al momento de escribir este artículo. Úselo solo como ejemplo, copiar y pegar al azar no lo ayudará. Modifique esto primero a sus necesidades
Además, no olvide leer los comentarios en el código.
El código
Use esto como un método en su clase para verificar primero si falta la columna que desea agregar. Hacemos esto solo para no repetir el proceso de alteración de la tabla Receive_barcode. Solo menciónalo como parte de tu clase. En el siguiente paso, verá cómo lo usaremos.
public boolean is_column_exists(SQLiteDatabase mDatabase , String table_name,
String column_name) {
//checks if table_name has column_name
Cursor cursor = mDatabase.rawQuery("pragma table_info("+table_name+")",null);
while (cursor.moveToNext()){
if (cursor.getString(cursor.getColumnIndex("name")).equalsIgnoreCase(column_name)) return true;
}
return false;
}
Luego, el siguiente código se usa para crear la tabla Receta_barcode si ya NO sale por primera vez para los usuarios de su aplicación. Y observe el "SI NO EXISTE" en el código. Tiene importancia.
//mDatabase should be defined as a Class member (global variable)
//for ease of access :
//SQLiteDatabse mDatabase=SQLiteDatabase.openOrCreateDatabase(dbfile_path, null);
creation_query = " CREATE TABLE if not exists receipt_barcode ( ";
creation_query += "\n record_id INTEGER PRIMARY KEY AUTOINCREMENT,";
creation_query += "\n rcpt_id INT( 11 ) NOT NULL,";
creation_query += "\n barcode VARCHAR( 255 ) NOT NULL ,";
creation_query += "\n barcode_price VARCHAR( 255 ) DEFAULT (0),";
creation_query += "\n PRIMARY KEY ( record_id ) );";
mDatabase.execSQL(creation_query);
//This is where the important part comes in regarding the question in this page:
//adding the missing primary key record_id in table receipt_barcode for older versions
if (!is_column_exists(mDatabase, "receipt_barcode","record_id")){
mDatabase.beginTransaction();
try{
Log.e("record_id", "creating");
creation_query="CREATE TEMPORARY TABLE t1_backup(";
creation_query+="record_id INTEGER PRIMARY KEY AUTOINCREMENT,";
creation_query+="rcpt_id INT( 11 ) NOT NULL,";
creation_query+="barcode VARCHAR( 255 ) NOT NULL ,";
creation_query+="barcode_price VARCHAR( 255 ) NOT NULL DEFAULT (0) );";
mDatabase.execSQL(creation_query);
creation_query="INSERT INTO t1_backup(rcpt_id,barcode,barcode_price) SELECT rcpt_id,barcode,barcode_price FROM receipt_barcode;";
mDatabase.execSQL(creation_query);
creation_query="DROP TABLE receipt_barcode;";
mDatabase.execSQL(creation_query);
creation_query="CREATE TABLE receipt_barcode (";
creation_query+="record_id INTEGER PRIMARY KEY AUTOINCREMENT,";
creation_query+="rcpt_id INT( 11 ) NOT NULL,";
creation_query+="barcode VARCHAR( 255 ) NOT NULL ,";
creation_query+="barcode_price VARCHAR( 255 ) NOT NULL DEFAULT (0) );";
mDatabase.execSQL(creation_query);
creation_query="INSERT INTO receipt_barcode(record_id,rcpt_id,barcode,barcode_price) SELECT record_id,rcpt_id,barcode,barcode_price FROM t1_backup;";
mDatabase.execSQL(creation_query);
creation_query="DROP TABLE t1_backup;";
mDatabase.execSQL(creation_query);
mdb.setTransactionSuccessful();
} catch (Exception exception ){
Log.e("table receipt_bracode", "Table receipt_barcode did not get a primary key (record_id");
exception.printStackTrace();
} finally {
mDatabase.endTransaction();
}