Android:使用SimpleCursorAdapter从数据库获取数据到ListView

我正在编程一个Android应用程序,应该使用数据库来存储数据并从中读取数据。 使用本教程(在archive.org上),我得到了应用程序来创build一个数据库,我能够创build新的条目,但是,我不知道,如何读取数据库来获取存储在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是错误的,因为它必须是android:list。

使用链接的教程中的数据库格式,每一行都有一个_idisbntitlepublisher 。 现在让我们假设你想在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构造函数中的最后两个参数是缺less的。 他们是“从”和“到”的参数:

  • 我们希望获得存储在列名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。

我希望有一点帮助。 还有很多东西要学,但也许这会给你一些基本知识。


最后的评论

closures我的头顶,添加新数据后刷新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创build一个variables,但这很简单:

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

祝你好运!

游标中的每个项目都不使用适配器,为整个游标创build一个适配器。您可以将此列表视图设置为使用该游标。 尝试一下这样的SimpleCursorAdapter教程