Android sqlite如何检查记录是否存在

nek*_*ouh 44 sqlite android

我想检查记录是否存在.

这是我尝试过的:

MainActivity.class

    public void onTextChanged(CharSequence s, int start, int before, int count) {

        System.out.println("Ontext changed " + new String(s.toString()));
        strDocumentFrom = s.toString();         

        if(s.toString().isEmpty()){

        } else {

             try{
                 strTransactionDate = dbHelper.getTransactionDateByDocumentNumber(strDocumentFrom);
                 //strTotalAmount = dbHelper.getTotalAmountByDocumentNumber(strDocumentFrom);
                 //strVan = dbHelper.getVanByDocumentNumber(strDocumentFrom);


                 //etTransactionDate.setText(strTransactionDate);
                 //etTotalAmount.setText(strTotalAmount);
                 //Log.d("Van", "" + strVan);
                 //etVan.setText(strVan);

             } catch (SQLiteException e) {
                 e.printStackTrace();
                 Toast.makeText(ReceivingStocksHeader.this, 
                         "Document number does not exist.", Toast.LENGTH_SHORT).show();
             }

        }
Run Code Online (Sandbox Code Playgroud)

DBHelper.class

            // TODO DISPLAYING RECORDS TO TRANSRCVHEADER
        public String getTransactionDateByDocumentNumber(String strDocumentNumber){
            String[] columns = new String[]{KEY_TRANSACTIONDATE};

            Cursor c = myDataBase.query(TBL_INTRANS, 
                    columns, null, 
                    null, null, null, null, null);

            if(c != null){
                c.moveToFirst();
                String date = c.getString(0);
                return date;
            } else {
                Log.d("Error", "No record exists");
            }


            return null;
        }
Run Code Online (Sandbox Code Playgroud)

但它没有让它到catch块来显示吐司.

我在这里做错了什么?

dip*_*ali 91

public static boolean CheckIsDataAlreadyInDBorNot(String TableName,
        String dbfield, String fieldValue) {
    SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
    String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue;
    Cursor cursor = sqldb.rawQuery(Query, null);
        if(cursor.getCount() <= 0){
            cursor.close();
            return false;
        }
    cursor.close();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我希望这对你有用...如果db中已存在记录,则此函数返回true.否则返回false.

  • 我会在查询中添加"LIMIT 1",因为你只想要1行 (3认同)
  • @dipali好的.简而言之,原始查询更容易受到SQL注入攻击.检查我的答案的首选方式. (2认同)

Cha*_*ham 30

这些都是很好的答案,但许多人忘记关闭光标和数据库.如果不关闭游标或数据库,则可能会遇到内存泄漏.

另外:
搜索时可能会出现String包含非字母/数字字符的错误.例如:" 1a5f9ea3-ec4b-406b-a567-e6927640db40".破折号(-)会导致unrecognized token错误.您可以通过将字符串放入数组中来克服此问题.所以养成这样查询的习惯:

public boolean hasObject(String id) {
    SQLiteDatabase db = getWritableDatabase();
    String selectString = "SELECT * FROM " + _TABLE + " WHERE " + _ID + " =?";

    // Add the String you are searching by here. 
    // Put it in an array to avoid an unrecognized token error 
    Cursor cursor = db.rawQuery(selectString, new String[] {id}); 

    boolean hasObject = false;
    if(cursor.moveToFirst()){
        hasObject = true;

        //region if you had multiple records to check for, use this region. 

        int count = 0;
        while(cursor.moveToNext()){
          count++;
        }
        //here, count is records found
        Log.d(TAG, String.format("%d records found", count));

        //endregion

    } 

    cursor.close();          // Dont forget to close your cursor
    db.close();              //AND your Database!
    return hasObject;
}
Run Code Online (Sandbox Code Playgroud)


Piy*_*ush 21

你也可以看到这个:

if (cursor.moveToFirst()) {
// record exists
} else {
// record not found
}
Run Code Online (Sandbox Code Playgroud)

要么

你只需检查Cursor not null,然后检查count不为0.

所以,你试试这个......

DBHelper.getReadableDatabase();

Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE    yourKey=? AND yourKey1=?", new String[]{keyValue,keyvalue1});

if (mCursor != null)
{
            return true;
/* record exist */
 }
else
{
        return false;
/* record not exist */
}
Run Code Online (Sandbox Code Playgroud)


Kap*_*uri 14

原始查询更容易受到SQL注入攻击.我建议改用query()方法.

public boolean Exists(String searchItem) {

    String[] columns = { COLUMN_NAME };
    String selection = COLUMN_NAME + " =?";
    String[] selectionArgs = { searchItem };
    String limit = "1";

    Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null, limit);
    boolean exists = (cursor.getCount() > 0);
    cursor.close();
    return exists;
}
Run Code Online (Sandbox Code Playgroud)

来源:这里


ins*_*iac 8

您可以使用SELECT EXISTS命令并从文档中cursor使用a 执行它rawQuery

EXISTS运算符始终求值为整数值0和1之一.如果执行指定为EXISTS运算符的右侧操作数的SELECT语句将返回一行或多行,则EXISTS运算符的计算结果为1.如果执行SELECT根本不返回任何行,然后EXISTS运算符的计算结果为0.


Sap*_*aik 6

SELECT EXISTS with LIMIT 1要快得多。

查询示例SELECT EXISTS (SELECT * FROM table_name WHERE column='value' LIMIT 1);

代码示例:

public boolean columnExists(String value) {
    String sql = "SELECT EXISTS (SELECT * FROM table_name WHERE column='"+value+"' LIMIT 1)";
    Cursor cursor = database.rawQuery(sql, null);
    cursor.moveToFirst();

    // cursor.getInt(0) is 1 if column with value exists
    if (cursor.getInt(0) == 1) { 
        cursor.close();
        return true;
    } else {
        cursor.close();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)