Giới thiệu
Điều này dựa trên java của Android và đó là một ví dụ điển hình về việc thay đổi cơ sở dữ liệu mà không làm phiền người hâm mộ / khách hàng ứng dụng của bạn. Điều này dựa trên ý tưởng của trang Câu hỏi thường gặp về SQLite
http://sqlite.org/faq.html#q11
Vấn đề
Tôi không nhận thấy rằng tôi cần phải đặt row_number hoặc record_id để xóa một mặt hàng đã mua trong biên lai và đồng thời số mã vạch của mặt hàng đã đánh lừa tôi nghĩ rằng nó là chìa khóa để xóa mặt hàng đó. Tôi đang lưu chi tiết biên nhận trong bảng biên nhận_barcode. Để nó không có record_id có thể có nghĩa là xóa tất cả các bản ghi của cùng một mặt hàng trong biên lai nếu tôi sử dụng mã vạch mặt hàng làm khóa.
Để ý
Vui lòng hiểu rằng đây là bản sao-dán mã của tôi mà tôi đang thực hiện tại thời điểm viết bài này. Chỉ sử dụng nó làm ví dụ, sao chép dán ngẫu nhiên sẽ không giúp ích cho bạn. Sửa đổi điều này trước theo nhu cầu của bạn
Cũng xin đừng quên đọc các bình luận trong mã.
Mật mã
Sử dụng phương thức này như một phương thức trong lớp của bạn để kiểm tra thứ nhất xem cột bạn muốn thêm có bị thiếu hay không. Chúng tôi làm điều này chỉ để không lặp lại quá trình thay đổi bảng biên nhận_barcode. Chỉ cần đề cập đến nó như một phần của lớp học của bạn. Trong bước tiếp theo, bạn sẽ thấy cách chúng tôi sử dụng nó.
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;
}
Sau đó, mã sau đây được sử dụng để tạo bảng biên nhận_barcode nếu nó KHÔNG thoát cho người dùng lần đầu tiên sử dụng ứng dụng của bạn. Và hãy lưu ý "NẾU KHÔNG TỒN TẠI" trong mã. Nó có tầm quan trọng.
//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();
}