繁体   English   中英

Android sqlite 如何查询一条记录是否存在

[英]Android sqlite how to check if a record exists

我想检查记录是否存在。

这是我尝试过的:

主活动.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();
             }

        }

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

但它并没有将它送到 catch 块来显示祝酒词。

我在这里做错了什么?

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

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

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

另外:
按包含非字母/数字字符的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;
}

你也可以看到这个:

if (cursor.moveToFirst()) {
// record exists
} else {
// record not found
}

之后您只需检查 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 */
}

原始查询更容易受到 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;
}

来源:这里

您可以使用SELECT EXISTS命令并使用rawQuerycursor执行它,来自文档

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

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

我已经尝试了本页中提到的所有方法,但只有以下方法对我有效。

Cursor c=db.rawQuery("SELECT * FROM user WHERE idno='"+txtID.getText()+"'", null);
if(c.moveToFirst())
{
 showMessage("Error", "Record exist");
}
else
{
 // Inserting record
}

最高投票答案没有提到的一件事是,如果搜索值是这样的文本值,则您需要单引号,“像这样”:

public boolean checkIfMyTitleExists(String title) {
    String Query = "Select * from " + TABLE_NAME + " where " + COL1 + " = " + "'" + title + "'";
    Cursor cursor = database.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return false;
    }
    cursor.close();

    return true;
}

否则,您将收到“SQL(查询)错误或缺少数据库”错误,就像我在标题字段周围没有单引号时所做的那样。

如果是数值,则不需要单引号。

有关更多详细信息,请参阅此SQL 帖子

SQLiteDatabase sqldb = MyProvider.db;
String Query = "Select * from " + TABLE_NAME ;
Cursor cursor = sqldb.rawQuery(Query, null);
cursor.moveToLast(); //if you not place this cursor.getCount() always give same integer (1) or current position of cursor.

if(cursor.getCount()<=0){
    Log.v("tag","if 1 "+cursor.getCount());
    return false;
}
Log.v("tag","2 else  "+cursor.getCount());

return true;

如果你不使用cursor.moveToLast()

cursor.getCount()总是给出相同的整数( 1 )或光标的当前位置。

代码:

private String[] allPushColumns = { MySQLiteHelper.COLUMN_PUSH_ID,
        MySQLiteHelper.COLUMN_PUSH_TITLE, MySQLiteHelper.COLUMN_PUSH_CONTENT, MySQLiteHelper.COLUMN_PUSH_TIME,
        MySQLiteHelper.COLUMN_PUSH_TYPE, MySQLiteHelper.COLUMN_PUSH_MSG_ID}; 

public boolean checkUniqueId(String msg_id){

    Cursor cursor = database.query(MySQLiteHelper.TABLE_PUSH,
            allPushColumns, MySQLiteHelper.COLUMN_PUSH_MSG_ID + "=?", new String [] { msg_id }, null, null, MySQLiteHelper.COLUMN_PUSH_ID +" DESC");

    if(cursor.getCount() <= 0){
        return false;
    }
    return true;
}

这是一个基于 dipali 和 Piyush Gupta 发布的组合的简单解决方案:

  public boolean dbHasData(String searchTable, String searchColumn, String searchKey) {
    String query = "Select * from " + searchTable + " where " + searchColumn + " = ?";
    return getReadableDatabase().rawQuery(query, new String[]{searchKey}).moveToFirst();
  }

由于可能通过游标泄漏数据的最佳解决方案:

 Cursor cursor = null;
    try {
          cursor =  .... some query (raw or not your choice)
          return cursor.moveToNext();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }

1) 从 API KITKAT你可以使用资源 try()

try (cursor = ...some query)

2) 如果你查询 VARCHAR TYPE 使用'...'例如。 COLUMN_NAME='string_to_search'

3) 不要使用 moveToFirst() 当您需要从开始迭代时使用

4) 避免 getCount() 代价高昂——它迭代许多记录来计算它们。 它不返回存储的变量。 第二个调用可能会有一些缓存,但第一个调用在计数之前不知道答案。

尝试使用 cursor.isNull 方法。 示例:

song.isFavorite = cursor.isNull(cursor.getColumnIndex("favorite"));

你可以这样使用:

String Query = "Select * from " + TABLE_NAME + " where " + Cust_id + " = " + cust_no;

Cursor cursorr = db.rawQuery(Query, null);
if(cursor.getCount() <= 0){
cursorr.close();
}
cursor.close();
private boolean checkDataExistOrNot(String columnName, String value) {
    SQLiteDatabase sqLiteDatabase = getReadableDatabase();
    String query = "SELECT * FROM" + TABLE_NAME + " WHERE " + columnName + " = " + value;
    Cursor cursor = sqLiteDatabase.rawQuery(query, null);
    if (cursor.getCount() <= 0) {
        cursor.close();
        return false;  // return false if value not exists in database
    }
    cursor.close();
    return true;  // return true if value exists in database
}

我更喜欢这样做,因为它比其他方法更快且更便宜:

Cursor cursor = db.rawQuery("SELECT 1 FROM table WHERE condition = 1 LIMIT 1", null);
try {
    if (cursor.moveToNext()) {
       //Record exists
    } else {
       //Record doesn't exists
    }
} finally {
    cursor.close();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM