首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SQLite 判斷記錄是否存在:用 count(*) 避免 Cursor 陷阱

     編輯:程式設計綜合問答

錯誤示範

Cursor result = db.rawQuery("SELECT 學號 FROM grade WHERE 學號 = 123", null);
if (???) {  // 這裡該怎麼寫?
    Toast.makeText(this, "學號不存在", Toast.LENGTH_SHORT).show();
}

為什麼不建議用 Cursor 判斷

  • result.moveToFirst() / result.getCount() 需額外移動游標、釋放資源,代碼冗長
  • 僅需「是/否」判斷時,查詢完整列浪費 I/O 與內存

最佳實踐:聚合查詢 + 直接取值

// 1. SQL 層面直接返回計數
Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM grade WHERE 學號 = ?", new String[]{"123"});

int count = 0;
if (cursor.moveToFirst()) {
    count = cursor.getInt(0);  // 第 0 列即 COUNT(*) 結果
}
cursor.close();

if (count == 0) {
    Toast.makeText(this, "學號不存在", Toast.LENGTH_SHORT).show();
}

進階封裝:通用存在性檢查工具方法

public boolean exists(SQLiteDatabase db, String table, String whereClause, String[] whereArgs) {
    String sql = "SELECT COUNT(*) FROM " + table + " WHERE " + whereClause;
    Cursor cursor = null;
    try {
        cursor = db.rawQuery(sql, whereArgs);
        return cursor.moveToFirst() && cursor.getInt(0) > 0;
    } finally {
        if (cursor != null) cursor.close();
    }
}

// 調用示例
if (!exists(db, "grade", "學號 = ?", new String[]{"123"})) {
    Toast.makeText(this, "學號不存在", Toast.LENGTH_SHORT).show();
}

性能對比

方案IO 開銷內存佔用代碼複雜度
SELECT 列 + Cursor.getCount()讀取所有匹配行較高中等
SELECT COUNT(*)僅掃描索引/統計信息極低(單行單列)低
EXISTS 子查詢(SQLite 不直接支持)---

核心原則

「只查所需,聚合下推」——判斷存在性時,讓數據庫引擎完成計數,應用層只取一個整數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved