2010-03-04 38 views
23

Tôi đang tìm đến cách chính xác và nhanh nhất để kiểm tra xem một kỷ lục tồn tại trong cơ sở dữ liệu:Bản ghi Android tồn tại() trong cơ sở dữ liệu?

public boolean Exists(String _id) { 
    Cursor c=db.query(TABLENAME(), new String[] {"1"}, "_ID="+_id, null, null, null, null); 
    if (!c.equals(null)) 
     return c.moveToFirst(); 
    return false; 
} 

Bạn có thấy bất kỳ vấn đề với nó?

+0

Thanh toán câu trả lời của tôi tại đây: http://stackoverflow.com/questions/27597922/android-sqlite-check-if-row-exists-in-table/43849296#43849296 –

Trả lời

42

Hãy xem xét rằng mDbSqlLiteDatabase bạn lớp

public boolean Exists(String _id) { 
    Cursor cursor = mDb.rawQuery("select 1 from yourTable where _id=%s", 
     new String[] { _id }); 
    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
    return exists; 
} 
  • tôi giữ thông số của bạn _id như một String nhưng tôi nghĩ rằng nó phải là một Long.
  • select 1 nhanh hơn select columnName vì quá trình này không cần truy xuất tất cả các giá trị từ bảng trong mệnh đề chọn.
  • bạn có thể đặt chuỗi select 1 from... trong hằng số tĩnh cuối cùng để thậm chí còn nhanh hơn.
+0

arf bạn đã thay đổi câu hỏi của mình trong khi tôi trả lời. .. – tbruyelle

+4

bạn cũng nên đóng con trỏ trước khi trả về một giá trị. nó không gây ra sự cố mà nó đưa ra cảnh báo. –

+0

có bạn đúng, tôi đã cập nhật câu trả lời của tôi – tbruyelle

1

Hãy thử điều này:

Trong DatabaseHelper của bạn, đưa phương pháp này ...

public String Exist(String user) {   
    String username=""; 
    SQLiteDatabase db = this.getReadableDatabase();    

    try { 
     Cursor c = db.query(TABLE_USER, null, KEY_USER + "=?", new String[]{String.valueOf(user)},null, null, null);            

     if (c == null) {       
      return username;         
     } 
     else {  
      c.moveToFirst();    
      username = c.getString(c.getColumnIndex(KEY_USER)); 
     }       
    } 

    catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return username; 
} 

sau đó trong OnClickListener của bạn, hãy cố gắng gọi phương thức mà bạn tạo trong DatabaseHelper của bạn. Hãy thử mã này:

String myUser = txtUser.getText().toString(); 
String storedUser = db.Exist(myUser); 


//If Username exist 
if (myUser.equals(storedUser)){ 
    Toast.makeText(getApplicationContext(), "Username already exist!", Toast.LENGTH_SHORT).show(); 
5

Câu hỏi này và câu trả lời đã chọn hữu ích cho tôi để tìm hiểu cách kiểm tra bản ghi đơn giản và nhanh chóng. Tuy nhiên, tôi đã thấy nhiều nơi khuyên bạn không nên sử dụng rawQuery vì khả năng tiêm SQL. (Ví dụ, rawQuery Vs. database.query)

Vì vậy, đây là những gì tôi đã quyết định về:

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

Tôi không biết nếu điều này là nhanh như câu trả lời được lựa chọn hay không, nhưng sau khi nghiên cứu này nó có vẻ phù hợp cho các quy ước Android được đề xuất nhiều hơn.

Cập nhật

bây giờ tôi khuyên @ câu trả lời Yuku, nhưng tôi sẽ không xóa tôi nhưng vì tôi vẫn muốn để hướng dẫn mọi người đi từ việc sử dụng các truy vấn liệu.

4

Vì bạn đang tìm kiếm câu trả lời từ 'nguồn đáng tin cậy và/hoặc chính thức', ở đây trong DatabaseUtils chúng tôi có một phương pháp được gọi là queryNumEntries.

Vì vậy, phương pháp của bạn có thể được thực hiện như thế này:

public boolean Exists(String _id) { 
    return DatabaseUtils.queryNumEntries(db, TABLENAME(), "_ID=?", new String[] {"1"}) > 0; 
} 

Hoặc, nhanh hơn một:

public boolean Exists(String _id) { 
    return DatabaseUtils.longForQuery(db, "select count(*) from " + TABLENAME() + " where _ID=? limit 1", new String[] {"1"}) > 0; 
} 
+0

Đây là loại câu trả lời tôi đang tìm kiếm khi tôi thực hiện tiền thưởng. Tôi không biết về các DatabaseUtils trước đây. Nếu bạn không phiền, có thể bạn có thể giải thích ngắn gọn lý do tại sao longForQuery nhanh hơn? Tài liệu này hơi thưa thớt một chút về số đó – Suragch

+0

Tôi đoán nó nhanh hơn vì mệnh đề LIMIT 1, ngăn nó đếm số hàng nếu bạn có nhiều hàng đáp ứng tiêu chí lựa chọn. Tuy nhiên, vì tiêu chí của bạn là _ID, có thể được giả định duy nhất cho một bảng cụ thể, thì cả hai tiêu chí đều phải có cùng tốc độ. – yuku

0

này hoạt động tốt:

Cursor cursor = null; 
    String sql ="SELECT * FROM "+TableName+" WHERE ID="+idValue; 
    cursor= db.rawQuery(sql,null); 
    Log.d("ISEXISTS","Cursor Count : " + cursor.getCount()); 

    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
Các vấn đề liên quan