Einführung
Dies basiert auf Android Java und ist ein gutes Beispiel für das Ändern der Datenbank, ohne Ihre Anwendungsfans / Kunden zu stören. Dies basiert auf der Idee der SQLite-FAQ-Seite
http://sqlite.org/faq.html#q11
Das Problem
Ich habe nicht bemerkt, dass ich eine Zeilennummer oder eine Datensatz-ID festlegen muss, um einen einzelnen gekauften Artikel in einer Quittung zu löschen, und gleichzeitig hat mich die Artikel-Barcode-Nummer dazu gebracht, darüber nachzudenken, ihn als Schlüssel zum Löschen dieses Artikels zu verwenden. Ich speichere eine Belegdetails in der Tabelle Receipt_Barcode. Wenn Sie es ohne record_id belassen, können Sie alle Datensätze desselben Artikels in einer Quittung löschen, wenn ich den Artikel-Barcode als Schlüssel verwendet habe.
Beachten
Bitte haben Sie Verständnis dafür, dass dies eine Kopie meines Codes ist, an dem ich zum Zeitpunkt des Schreibens arbeite. Verwenden Sie es nur als Beispiel. Das zufällige Kopieren und Einfügen hilft Ihnen nicht weiter. Ändern Sie dies zuerst an Ihre Bedürfnisse
Bitte vergessen Sie auch nicht, die Kommentare im Code zu lesen.
Der Code
Verwenden Sie dies als Methode in Ihrer Klasse, um zunächst zu überprüfen, ob die Spalte, die Sie hinzufügen möchten, fehlt. Wir tun dies nur, um den Vorgang des Änderns der Tabelle Receipt_Barcode nicht zu wiederholen. Erwähne es einfach als Teil deiner Klasse. Im nächsten Schritt werden Sie sehen, wie wir es verwenden werden.
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;
}
Der folgende Code wird dann verwendet, um die Tabelle Receipt_Barcode zu erstellen, wenn sie bereits zum ersten Mal von Benutzern Ihrer App NICHT beendet wird . Und bitte beachten Sie das "WENN NICHT EXISTIERT" im Code. Es hat Bedeutung.
//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();
}