introduzione
Si basa su java di Android ed è un buon esempio per modificare il database senza infastidire i fan / clienti dell'applicazione. Questo si basa sull'idea della pagina delle domande frequenti su SQLite
http://sqlite.org/faq.html#q11
Il problema
Non ho notato che dovevo impostare un row_number o record_id per eliminare un singolo articolo acquistato in una ricevuta, e allo stesso tempo il numero del codice a barre dell'articolo mi ha indotto a pensare di utilizzarlo come chiave per eliminare quell'articolo. Sto salvando i dettagli di una ricevuta nella tabella Receiver_barcode. Lasciarlo senza record_id può significare l'eliminazione di tutti i record dello stesso articolo in una ricevuta se ho utilizzato il codice a barre dell'articolo come chiave.
Avviso
Ti preghiamo di comprendere che questo è un copia-incolla del mio codice su cui sto lavorando al momento della stesura di questo documento. Usalo solo come esempio, il copia-incolla in modo casuale non ti aiuterà. Modificare prima questo in base alle proprie esigenze
Inoltre, non dimenticare di leggere i commenti nel codice.
Il codice
Usa questo come metodo nella tua classe per verificare prima se la colonna che desideri aggiungere è mancante. Lo facciamo solo per non ripetere il processo di alterazione della tabella Receiver_barcode. Menzionalo come parte della tua classe. Nel passaggio successivo vedrai come lo useremo.
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;
}
Quindi, il codice seguente viene utilizzato per creare la tabella Receiver_barcode se NON esce già per la prima volta dagli utenti della tua app. E si prega di notare "SE NON ESISTE" nel codice. Ha importanza.
//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();
}