2015-02-11 10 views
0

我在我的Android應用程序中使用SQLite數據庫。我從我現在無法找到的特定網站推算出我的代碼。但是代碼包含一個填充和檢索SQLite數據行的類:我稱之爲dbData類。據我所知,它只是存儲數據行。沒有構造函數,所以顯然它使用默認值調用時創建適配器的實例。 tostring作爲dbData返回。但是一個Id也可以設置並獲得。getAdaptoer如何與SQlite數據檢索和存儲的這個簡單類一起使用?

我的一個大問題是爲什麼使用這個類而不是其他類調用這個類的變量?我的下一個問題是,如果listAdaptor返回適配器(根據http://developer.android.com/reference/android/widget/ListView.html#getAdapter()),它會在dbData行dbData中填入哪些信息(dbData)lstView.getAdapter()。getItem(0);它允許dbData返回一個字符串並獲取正確的數據庫行?它會自動將適配器轉換爲數據庫密鑰字段嗎?

感謝您的任何反饋意見。

下面的代碼:

public class dbData { 

    private long id; 
    private String dbData; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getDbData() { 
     return dbData; 
    } 

    public void setDbData(String dbData) { 
     this.dbData = dbData; 
    } 

    // Will be used by the ArrayAdapter in the ListView 
    @Override 
    public String toString() { 
     return dbData; 
    } 

} 

這裏是它是如何被調用的例子:

public void onClick(View view) { 
    @SuppressWarnings("unchecked") 

    ListView lstView = (ListView)findViewById(R.id.lstHolidays); 

    ArrayAdapter<dbData> adapter = (ArrayAdapter<dbData>) lstView.getAdapter(); 
    dbData dbData = null; 
    switch (view.getId()) { 
     case R.id.add: 
      String[] comments = new String[] { "Cool", "Very nice", "Hate it" }; 
      int nextInt = new Random().nextInt(3); 
      // save the new dbData to the database 
      dbData = datasource.createDB_Row(comments[nextInt]); 
      adapter.add(dbData); 
      break; 
     case R.id.delete: 
      if (lstView.getAdapter().getCount() > 0) { 
       dbData = (dbData) lstView.getAdapter().getItem(0); 
       datasource.deleteDB_Row(dbData); 
       adapter.remove(dbData); 
      } 
      break; 
    } 
    adapter.notifyDataSetChanged(); 
} 
+0

您發佈的代碼似乎沒有做任何這些事情? – immibis 2015-02-11 02:50:06

+0

我摸索了一下我的解釋。簡化了第一段。這有幫助嗎? – 2015-02-11 02:52:35

回答

1

您在這裏有幾個問題,如你所說。

  1. 爲什麼要用dbData?答案:因爲它可以對數據庫行進行操作。其中:

    dbData = (dbData) lstView.getAdapter().getItem(0); 
    

    如果沒有dbData類,你會怎麼做?你可能必須這樣做:

    dbData_id = (Long) lstView.getAdapter().getItem(0).getItem(0); 
    dbData_dbData = (String) lstView.getAdapter().getItem(0).getItem(1); 
    

    現在想象一下,如果數據庫中有20或30個字段。

  2. 該行是什麼信息dbData = (dbData) lstView.getAdapter().getItem(0);填入dbData

    這使得dbData(變量)包含對dbData對象的引用。由於您使用的是ArrayAdapter,因此此參考來自陣列。這裏沒有數據庫魔法,只是一個數組訪問。

  3. 它會自動將適配器轉換爲數據庫密鑰字段嗎?

    我不知道你的意思。不,它只是從數組中獲取元素(隱藏在ArrayAdapter內)。

  4. 行是否重要,因爲它沒有被使用?

    它被使用。看下面的幾行,你會看到adapter.add(dbData);。和adapter.remove(dbData);adapter.notifyDataSetChanged();

+0

謝謝。發現了你在第4項下提到的錯誤。關於數字3,我的問題可能會更好地陳述爲「它從數組(適配器?)獲得的元素是什麼?以及如何將它轉換爲dbData的數據庫行?」換一種說法,它是如何知道如何通過從listView中獲取適配器來返回dbData行的id與dbData.getID()。該代碼在deletDB_Row方法中具有getID的實現,但其中沒有任何地方使用setID。 – 2015-02-11 03:19:42

+0

@EdwardBagby在過去的某個時候,您的代碼將所有行添加到適配器(將它們內部存儲在一個數組中)。 – immibis 2015-02-11 04:50:20

+0

我很感激你繼續迴應。我認爲這可能是我不熟悉的面向對象的事情 - 可能是因爲這是Java而不是.net,但我認爲我更好地隔離了我的問題,並在上​​面的答案「1」中指出了您的觀點。所以讓我這樣問,當lstView.getAdapter()。getItem(0);傳遞給dbData,dbData類是否知道自動填充私有長ID;和私人字符串dbData;通過適配器從列表中查看值(item&subItem)? – 2015-02-11 05:04:08

相關問題