pengantar
Ini didasarkan pada Java Android dan ini adalah contoh yang baik untuk mengubah database tanpa mengganggu penggemar / pelanggan aplikasi Anda. Ini didasarkan pada ide halaman FAQ SQLite
http://sqlite.org/faq.html#q11
Masalah
Saya tidak menyadari bahwa saya perlu menyetel row_number atau record_id untuk menghapus satu item yang dibeli dalam tanda terima, dan pada saat yang sama nomor barcode item menipu saya untuk berpikir menjadikannya sebagai kunci untuk menghapus item itu. Saya menyimpan detail tanda terima di tabel struk_barcode. Membiarkannya tanpa record_id bisa berarti menghapus semua record dari item yang sama dalam tanda terima jika saya menggunakan item barcode sebagai kuncinya.
Memperhatikan
Harap dipahami bahwa ini adalah salinan-tempel kode yang saya kerjakan pada saat penulisan ini. Gunakan hanya sebagai contoh, copy-paste secara acak tidak akan membantu Anda. Ubah ini terlebih dahulu sesuai kebutuhan Anda
Juga jangan lupa untuk membaca komentar di kode.
Kode
Gunakan ini sebagai metode di kelas Anda untuk memeriksa 1 apakah kolom yang ingin Anda tambahkan hilang. Kami melakukan ini hanya untuk tidak mengulangi proses mengubah kode tabel tanda terima. Sebut saja sebagai bagian dari kelas Anda. Pada langkah selanjutnya Anda akan melihat bagaimana kami akan menggunakannya.
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;
}
Kemudian, kode berikut digunakan untuk membuat tabel tanda terima_barcode jika sudah TIDAK keluar untuk pengguna aplikasi Anda yang pertama kali. Dan harap perhatikan "JIKA TIDAK ADA" di kode. Itu penting.
//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();
}