2012-08-22 111 views
16

我正在編寫一個android應用程序,該應用程序應該使用數據庫來存儲數據並從中讀取數據。使用this tutorial (on archive.org)我得到了應用程序來創建一個數據庫,我能夠創建新的條目,但是,我不知道如何讀取數據庫以獲取存儲在ListView中的數據。我知道這個網站上有很多類似的問題,但似乎沒有一個適用於教程中的數據庫。Android:使用SimpleCursorAdapter從數據庫獲取數據到ListView

代碼:

import java.util.Calendar; 

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter; 
import android.app.AlertDialog.Builder; 
import android.app.ListActivity; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ListView; 


public class Marks extends ListActivity { 

DBAdapter db = new DBAdapter(this); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.marks); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    db.open(); 

    getData(); 
} 

@SuppressWarnings("deprecation") 
private void getData() { 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      db.getAllMarks(), 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 

    ListView listView = (ListView) findViewById(R.id.marks_list); 
    listView.setAdapter(adapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.marks, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_add: 
     Calendar cal = Calendar.getInstance(); 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     int month = cal.get(Calendar.MONTH); 
     final String date = day + "." + month; 
     Builder builder = new Builder(this); 
     builder 
      .setTitle(R.string.dialog_addmarks) 
      .setItems(R.array.markslist, new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        @SuppressWarnings("unused") 
        long id; 
        String selection = getResources().getStringArray(R.array.markslist)[which]; 
        id = db.insertMark(date, "Default", selection); 
        } 
      }) 
      .show(); 
     getData(); 
     break; 
    case R.id.menu_delete: 
      //Deleting function yet to be implemented. 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

編輯:ListView控件ID是錯誤的,因爲它必須是機器人:列表。

回答

53

在您鏈接到,每一行都有一個_idisbntitle,並publisher教程使用的數據庫格式。現在讓我們假設你想在ListView顯示每一個標題:

db = new DBAdapter(this); 
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, 
     db.getAllTitles(), 
     new String[] { "title" }, 
     new int[] { android.R.id.text1 }); 

ListView listView = (ListView) findViewById(R.id.list); 
listView.setAdapter(adapter); 

(你並不需要通過光標自己循環,適配器做這個工作你!)

最後兩SimpleCursorAdapter構造函數中的參數就是你缺少的。他們是「從」和「到」的參數:

  • 我們希望得到存儲在列名title每本書的名字,這是我們「從」獲取信息。
  • 接下來我們需要告訴它「去」的位置:android.R.id.text1android.R.layout.simple_list_item_1佈局中的TextView。 (你可以挖掘你的SDK並親自看到simple_list_item_1.xml文件或者只是相信我。)

現在「from」和「to」參數都是數組,因爲我們可以通過多個信息欄,試試這個適配器以及:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_2, 
     db.getAllTitles(), 
     new String[] { "title", "publisher" }, 
     new int[] { android.R.id.text1, android.R.id.text2 }); 

有了這個適配器在其數據庫中的圖書將通過標題顯示,那麼出版商。我們所要做的只是使用一個佈局android.R.layout.simple_list_item_2,它需要兩個字段並定義哪些列轉到哪個TextView。

我希望能有所幫助。還有很多東西需要學習,但也許這會給你一些基礎知識。


最後的評論

關閉我的頭頂,刷新ListView控件添加新的數據後,試試這個:

public void onClick(DialogInterface dialog, int which) { 
    String selection = getResources().getStringArray(R.array.markslist)[which]; 
    db.insertMark(date, "Default", selection); 
    cursor.requery(); 
    adapter.notifyDataSetChanged(); 
} 

你必須定義adapter並創建變量爲cursor但這很簡單:

public class Marks extends ListActivity { 
    SimpleCursorAdapter adapter; 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    ... 

並更改相應的getData():

private void getData() { 
    cursor = db.getAllMarks(); 
    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      cursor, 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 
    ... 
} 

祝你好運!

+0

謝謝。我想我得到了,你想要解釋的是什麼。我用你的適​​配器,但我仍然得到一個異常,它會崩潰我的應用程序。我認爲錯誤是在別的地方呢? – BlueHazard

+0

複製並粘貼LogCat(使用問題左下角的編輯鏈接)。我會看一看。當您完成此操作時,請在評論中標記我(「@Sam」)。 – Sam

+0

我將LogCat添加到了我的問題中。感謝您的幫助。 – BlueHazard

0

遊標中的每個項目都沒有使用適配器,爲整個遊標創建了一個適配器。您可以將此列表視圖設置爲使用該遊標。嘗試一些SimpleCursorAdapter教程像this

相關問題