2014-09-19 25 views
0

我想要做的是獲取條目,一個接一個,這裏是代碼。一次獲得1的條目

Teams.Java 
public String getData(String key) { 
     // TODO Auto-generated method stub 
     String[] columns = new String[] { Key }; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, 
       null, null); 
     String result = ""; 
     int iName = c.getColumnIndex(Key); 
     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
      result = result + "," + c.getString(iName); 

     } 
     return result; 
    } 

活動

MainActivity.java 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TextView t1 = (TextView) findViewById(R.id.tvINames); 
     Teams stat = new Teams(this); 
     stat.open(); 
     String Names = stat.getName("KEY_TEAMS"); 
     stat.close(); 
     t1.setText(Names); 

是否需要logcat的,只是告訴我。

+0

只需獲取該函數中的所有值即可。返回ArrayList 或String []並迭代使用該數據。這有什麼問題? – 2014-09-19 08:32:17

+0

我應該做到這一點,但即時通訊使用每個字段的數據表。我的意思是,它真的有3個不同的領域,即時通訊。 – ken 2014-09-19 09:15:21

回答

0

首先,在線路的「按鍵」:

String[] columns = new String[] { Key }; 

int iName = c.getColumnIndex(Key); 

使用資本「K」,其中如在所述方法中,頭部中的參數被命名爲具有正常'k':

public String getData(String key) { 

您是否在Teams.java中使用名稱'Key'定義了一個字段? 我可以想象,這不會導致您的代碼的預期行爲,因爲該參數甚至沒有被使用。

我肯定會改變的另一件事是使用StringBuilder(或StringBuffer,如果它必須是線程安全的)用於連接getData()方法中的字符串。

而對於遍歷光標我只想用:

while (c.moveToNext()) { 
    ... 
} 

上以下行存在另一個矛盾:

String Names = stat.getName("KEY_TEAMS"); 

你調用比顯示的getData另一種方法(字符串鍵) - 方法。


如果我可以重寫你的方法,我建議是這樣的:

//Teams.Java 
public String getData(String key) { 

    String[] columns = new String[] { key }; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 

    final int iName = c.getColumnIndex(key); 

    StringBuilder result = new StringBuilder(); 
    while (c.moveToNext()) { 
     result.append(c.getString(iName)); 
     result.append(","); 
    } 

    return result.toString(); 
} 

AND 

//MainActivity.java 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    Teams stat = new Teams(this); 

    try { 
     stat.open(); 

     TextView t1 = (TextView) findViewById(R.id.tvINames); 
     t1.setText(stat.getData("KEY_TEAMS")); 
    } catch (Exception e) { 
     Log.e(MainActivity.class.getSimpleName(), "some meaningful error message 42!", e); 
    } finally { 
     stat.close(); 
    } 

} 

一般來說它是包裝所有訪問光標變成一個非常好的主意的try-catch-finally塊的確保它在任何情況下都關閉!

+0

至於公共字符串getData(字符串鍵){..這是關鍵,我只是misplelled。如果我有一個用名字鍵定義的字段,我不知道這是否需要,因爲我從MainActivity.java傳遞變量。你能解釋更多關於那個StringBuffer的東西嗎? – ken 2014-09-19 09:07:29

+0

你可以在這裏閱讀更多關於StringBuffer/StringBuilder的信息:http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer – AZOM 2014-09-19 09:11:08

+0

爲了讓你的代碼乾淨,更容易理解發生了什麼,我會刪除團隊內的任何字段。名稱爲'Key'或'key'的.java。如果您需要它們作爲後備,當方法中的參數不可用時,仍然可以有一個名爲'mKey'的字段(m代表成員,因此您可以立即知道它的來源),或者甚至可以使用常量 private static final String DEFAULT_KEY; – AZOM 2014-09-19 09:39:37