introduction
Ceci est basé sur le java d'Android et c'est un bon exemple pour changer la base de données sans ennuyer les fans / clients de votre application. Ceci est basé sur l'idée de la page FAQ SQLite
http://sqlite.org/faq.html#q11
Le problème
Je n'ai pas remarqué que je devais définir un row_number ou record_id pour supprimer un seul article acheté dans un reçu, et en même temps, le numéro de code à barres de l'article m'a trompé en pensant en faire la clé pour supprimer cet article. J'enregistre les détails d'un reçu dans la table reception_barcode. Le laisser sans record_id peut signifier la suppression de tous les enregistrements du même article dans un reçu si j'ai utilisé le code-barres de l'article comme clé.
Remarquer
Veuillez comprendre qu'il s'agit d'un copier-coller de mon code sur lequel je travaille au moment d'écrire ces lignes. Utilisez-le uniquement à titre d'exemple, le copier-coller au hasard ne vous aidera pas. Modifiez-le d'abord selon vos besoins
N'oubliez pas non plus de lire les commentaires dans le code.
Le code
Utilisez-le comme méthode dans votre classe pour vérifier d'abord si la colonne que vous souhaitez ajouter est manquante. Nous faisons cela juste pour ne pas répéter le processus de modification de la table reception_barcode. Mentionnez-le simplement dans le cadre de votre cours. Dans l'étape suivante, vous verrez comment nous l'utiliserons.
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;
}
Ensuite, le code suivant est utilisé pour créer la table receipt_barcode si elle ne déjà pas sortir pour les 1ers utilisateurs de temps de votre application. Et s'il vous plaît noter le "SI PAS EXISTANT" dans le code. Cela a de l'importance.
//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();
}