2012-02-20 54 views
0

目前我有一個查詢查看錶並返回最新的行,讀取該行並將字符串設置爲所選列索引中的值。製作更好的android sqlite查詢

目前我有9列,所以我最終制作了9種返回每列的方法,只是返回一個字符串並將其設置爲每個單獨的textview。

我是否設置遊標來返回行,然後在設置文字瀏覽時設置列索引。像

  cursor.getString(1) 

某事,這是我目前的查詢

  public String getName() { 
    // TODO Auto-generated method stub 
    String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_COLUMN2, 
      KEY_COLUMN3, KEY_COLUMN4, KEY_COLUMN5, KEY_COLUMN6, KEY_COLUMN7, KEY_COLUMN8 }; 
    Cursor c = mDb.query(true, DATABASE_TABLE, columns, null, null, null, 
      null, "_id DESC", "1"); 

    if (c != null) { 
     c.moveToFirst(); 
     String name = c.getString(1); 
     return name; 
    } 

    return null; 
} 
+0

如何返回字符串數組,地圖或自定義對象?返回光標不是一個好主意。 – 2012-02-20 19:13:11

回答

2

你可以很容易地改變getName()的東西領域無關,如:

public String getField(String fieldName) { 
    ... 
    String s = cursor.getString(cursor.getColumnIndexOrThrow(fieldName)); 
} 

而且使用它像:

String s = mDb.getField(mDb.KEY_NAME); 

此方法的問題在於,您不能使用getString()作爲數字列,因此您可以使用表中支持的每種數據類型的多種方法。解決這個問題的一種方法是查看遊標的getType()方法或僅從數據庫訪問方法返回完整的數據結構。假設你有:

DB Column  Field Type 
FOO    varchar 
BAR    integer 
BAZ    varchar 

如果你定義一個類,比如說,MyRowMapper你可以做這樣的事情:

public MyRowMapper getRow(String... queryParameters) { 
    //query table based on queryParameters 
    MyRowMapper mapper = null; 
    if (cursor.moveToFirst()) { 
     String foo = cursor.getString(cursor.getColumnIndexOrThrow("FOO")); 
     Integer bar = cursor.getInteger(cursor.getColumnIndexOrThrow("BAR")); 
     String baz = cursor.getString(cursor.getColumnIndexOrThrow("BAZ")); 

     mapper = new MyRowMapper(foo, bar, baz);    
    } 
    cursor.close(); // NEVER FORGET TO CLOSE YOUR CURSOR! 
    return mapper; 
} 

這僅僅是抽象的mailercode,所以取syntaxt用一粒鹽。但希望你明白這個主意。

+0

@ user1088701如果您只是從查詢中獲取單個值,則應該使用['SQLiteStatement'準備的語句](http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html ),因爲它們將更快執行。但是,比在這個答案中看到的所有東西都更好。 – Argyle 2012-02-20 19:31:32

+0

我得到 - 類型Cursor中的方法getString(int)不適用於String上的參數(String)s = cursor.getString(fieldName); – Tonious 2012-02-20 21:10:41

+0

哦,對不起,我的意思是'cursor.getString(cursor.getColumnIndexOrThrow(KEY_NAME));'我會修復答案。 – Pedantic 2012-02-20 21:33:06