我需要讀取具有可讀性的值并插入到另一個表中,并在同一函式中設定可寫。
public void Check(String msg){
//getdata from database
String query="SELECT " CUL_ID " FROM " STUDENT_TABLE " WHERE " CUL_QRCODE " like " msg " ";
SQLiteDatabase db1=this.getReadableDatabase();
db1.execSQL(query);
db1.close();
// I need to return this query in string variable value and put it into the queryString
String value = "";
String queryString ="INSERT INTO " TABLE_PRESENCE_TABLE " VALUES (" value " ,( SELECT count( " CUL_ID_PRESENCE " ) FROM " TABLE_PRESENCE_TABLE " WHERE " CUL_ID_PRESENCE " = ( SELECT " CUL_ID " FROM " STUDENT_TABLE " WHERE " CUL_QRCODE " = " msg ")) " 1 " , datetime('now'));";
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL(queryString);
db.close();
}
uj5u.com熱心網友回復:
我需要讀取具有可讀性的值并插入到另一個表中,并在同一函式中設定可寫。
你不需要。就像您按照以下要求使用/編碼第二列的子查詢一樣多:-
( SELECT count( " CUL_ID_PRESENCE " ) FROM " TABLE_PRESENCE_TABLE " WHERE " CUL_ID_PRESENCE " = ( SELECT " CUL_ID " FROM " STUDENT_TABLE " WHERE " CUL_QRCODE " = " msg ")) " 1 "
您可以為第一個值撰寫子查詢,即替換value為獲得該值的查詢。
例如,您可以在沒有前面查詢的情況下進行單個插入,如下所示:-
INSERT INTO presence VALUES
(
coalesce((SELECT cul_id FROM student WHERE cul_qrcode = 'message'),-99),
(SELECT count(cul_id_presence) FROM presence WHERE CUL_ID_PRESENCE = (SELECT CUL_ID FROM STUDENT WHERE CUL_QRCODE = 'message') 1),
datetime('now')
)
;
請注意,coalesce 函式會將 NULL(如果沒有 cul_qrcode LIKE msg)轉換為另一個值(在上述情況下為 -99)。
表和列名稱已被猜測,因此它們可能與您實際擁有的不匹配。
否則,要實際接收查詢的結果,您在Cursor 中捕獲結果,但不使用execSQL,請使用rawQuery或查詢便利方法。
-
execSQL 執行單個 SQL 陳述句,它不是 SELECT 或任何其他回傳資料的 SQL 陳述句。
我如何在變數字串中接收 getReadableDatabase() 的值就是這樣
要使用后跟插入的查詢,您將有以下內容:-
Cursor csr = db1.rawQuery(query,null);
String value = "-99"; /* assume that if nothing is returned then use -99 */
if(csr.moveToFirst) {
value = csr.getString(0);
}
csr.close(); /* SHOULD ALWAYS CLOSE CURSORS WHEN FINISHED WITH THEM */
但是,將引數連接到 SQL 是不好的做法,因為這被認為是 SQL 注入的可能性。相反,您應該系結引數(這將克服一個主要缺陷,因為您似乎可能沒有將 msg 括在單引號中,系結引數會將引數括在單引號中)。所以上面應該是:-
public void Check(String msg){
//getdata from database
String query="SELECT " CUL_ID " FROM " STUDENT_TABLE " WHERE " CUL_QRCODE " like ?"; //<<<<< use ? to allow bind of msg
SQLiteDatabase db1=this.getReadableDatabase();
Cursor csr = db1.rawQuery(query,new String[]{msg});
String value = "-99"; /* assume that if nothing is returned then use -99 */
if(csr.moveToFirst) {
value = csr.getString(0);
}
csr.close(); /* SHOULD ALWAYS CLOSE CURSORS WHEN FINISHED WITH THEM */
....
此外
沒有必要關閉資料庫然后重新打開它來明顯地在可讀和可寫之間切換。這是getReadableDatabase意志,如果有可能的回報,除非有某種原因,資料庫不能被打開,可寫的一個可寫的資料庫。如果回傳只讀資料庫,則后續getWritableDatabase很可能會失敗,除非以某種方式修復了潛在問題。
按照:-
創建和/或打開資料庫。這將與 getWritableDatabase() 回傳的物件相同,除非某些問題(例如磁盤已滿)要求以只讀方式打開資料庫。在這種情況下,將回傳只讀資料庫物件。如果問題得到解決,未來對 getWritableDatabase() 的呼叫可能會成功,在這種情況下,只讀資料庫物件將被關閉,讀/寫物件將在未來回傳。
- https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper#getReadableDatabase()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382493.html
標籤:爪哇 安卓 sql sqlite android-sqlite
