如何在同一函数中读取具有get readable的值并插入到具有set writeable的另一个表中



我需要用get readable读取值,并在同一函数中用set writeable插入另一个表。

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();
}

我需要用get readable读取值,并在同一函数中用set writeable插入另一个表。

您不需要。正如您已经使用/编码了第二列的子查询一样:-

( 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')
)
;
  • 注意,联合函数将把一个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注入的可能性。相反,您应该绑定参数(这将克服一个重大缺陷,因为您可能没有用单引号括起消息,绑定参数将用单引号包起参数(。所以上面应该是:-

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((

最新更新