簡體   English   中英

如何在嘗試添加項目之前檢查項目是否在數據庫中

[英]How to check if an item is in a database before trying to add it

我有一個 android 應用程序正在添加和更新數據庫。 學號是主鍵。 當用戶嘗試添加副本時,我試圖讓應用程序顯示一條消息。 這是我最近的嘗試; 它觸發了 catch 子句。

在我的主要活動中,我有這個條件語句:

 if (!dbHandler.checkStudentID(studentID)){
    Toast.makeText(MainActivity.this, "Student ID is a Duplicate",
         Toast.LENGTH_SHORT).show();
 }
 dbHandler.addNewStudent(studentID, firstName, lastName, grade);

在我的處理程序中,方法是這樣的:

public boolean checkStudentID (String studentID) {
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor checkID = db.rawQuery("SELECT student_id FROM " + TABLE_NAME +
                   " where student_id=?", new String[]{studentID});
   String x = checkID.getString(0);
   checkID.close();
   return x.isEmpty();
}

Logcat 沒有顯示任何問題,也沒有顯示任何語法問題,所以我不知道哪里不正確。

當使用 Cursor 時, rawQuery將返回位於第一行之前的Cursor(任何返回 Cursor 的 SQLiteDatabase 方法也是如此)。 要提取數據,您需要相應地輸入 position 和 Cursor。

在您的情況下,您只需要知道是否提取了任何數據,因此您可以使用moveToFirst方法。 如果可以移動(如果有任何數據)或 false(如果沒有數據),這將返回 true。

所以你可以使用類似的東西: -

public static boolean checkStudentID (String studentID) {
   boolean rv = false;
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor checkID = db.rawQuery("SELECT student_id FROM " + TABLE_NAME +
                   " where student_id=?", new String[]{studentID});
   if (checkID.moveToFirst()) {
       rv = true;
   }
   checkID.close();
   return rv;
}

這是我最近的嘗試; 它觸發了 catch 子句。

因為當您執行String x = checkID.getString(0); ,因此異常被捕獲/捕獲。

問題是如果studentIDString x = checkID.getString(0)包含null 這樣,調用x.isEmpty()將拋出 NullPointerException。 所以你應該通過以下方式攔截它:

public static boolean checkStudentID (String studentID) {
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor checkID = db.rawQuery("SELECT student_id FROM " + TABLE_NAME +
                   " where student_id=?", new String[]{studentID});
   String x = checkID.getString(0);
   checkID.close();
   if (x == null || x.isEmpty()) {
       return false;
   }
   else {
       return true;
   }
}

我認為您甚至可以完全不x.isEmpty()

如果Toast.makeText().show()沒有終止程序,您最好將addNewStudent部分包裝在else -case 中。 否則照樣執行!

if (!dbHandler.checkStudentID(studentID)){
   Toast.makeText(MainActivity.this, "Student ID is a Duplicate",
        Toast.LENGTH_SHORT).show();
}
else{
   dbHandler.addNewStudent(studentID, firstName, lastName, grade);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM