Giriş
Bu, Android'in java'sına dayanmaktadır ve uygulama hayranlarınızı / müşterilerinizi rahatsız etmeden veritabanını değiştirmeye iyi bir örnektir. Bu, http://sqlite.org/faq.html#q11 SQLite SSS sayfası fikrine dayanmaktadır.
Sorun
Bir makbuzda satın alınan tek bir öğeyi silmek için bir row_number veya record_id ayarlamam gerektiğini fark etmedim ve aynı zamanda öğenin barkod numarası, bu öğeyi silmek için anahtar olarak yapmayı düşünmem için beni kandırdı. Makbuz_barcode tablosuna bir fiş ayrıntılarını kaydediyorum. Kayıt kimliği olmadan bırakmak, kalem barkodunu anahtar olarak kullandıysam bir makbuzdaki aynı öğenin tüm kayıtlarını silmek anlamına gelebilir.
Farkına varmak
Lütfen bunun, bu yazının yazıldığı sırada üzerinde çalıştığım kodumun bir kopyası-yapıştırılması olduğunu anlayın. Sadece örnek olarak kullanın, rastgele kopyalayıp yapıştırmak size yardımcı olmaz. Önce bunu ihtiyaçlarınıza göre değiştirin
Ayrıca lütfen koddaki yorumları okumayı unutmayın.
Kod
1. eklemek istediğiniz sütunun eksik olup olmadığını kontrol etmek için sınıfınızda bunu bir yöntem olarak kullanın. Bunu sadece makbuz_barcode tablosunu değiştirme işlemini tekrarlamamak için yapıyoruz. Sadece sınıfınızın bir parçası olarak bahsedin. Bir sonraki adımda onu nasıl kullanacağımızı göreceksiniz.
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;
}
Ardından, aşağıdaki kod zaten eğer masa receipt_barcode oluşturmak için kullanılır DEĞİL uygulamanızın 1 kez kullananlar için çıkın. Ve lütfen kodda "MEVCUT DEĞİLSE" ifadesine dikkat edin. Önemi vardır.
//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();
}