【问题标题】:Android, bind ListView to SQLite DatabaseAndroid,将 ListView 绑定到 SQLite 数据库
【发布时间】:2011-12-03 17:04:45
【问题描述】:

我有一个 SQLiteDatabase 助手,它返回一个只有数据库名称列的游标:

public Cursor getNames() {
    Cursor cursor = db.query(TABLE_NAME, new String[] {NAME}, null, null, null, null, null);
    return cursor;
}

我正在尝试将此光标绑定到布局中包含的简单 ListView:

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</ListView>

java:

 Cursor cursor = db.getNames();
    startManagingCursor(cursor);

    ListAdapter adapter = new SimpleCursorAdapter (
            this,
            android.R.layout.simple_list_item_1,
            cursor,
            new String[] {constants.NAME},
            new int[] {android.R.id.text1}
            );

    setListAdapter(adapter);

我已按照我能找到的所有教程进行操作,但应用程序仍然意外停止。请告诉我我做错了什么!

这是 LOGCAT 跟踪,希望这是您需要的:

12-03 17:18:41.557: E/AndroidRuntime(30413): FATAL EXCEPTION: main
12-03 17:18:41.557: E/AndroidRuntime(30413): java.lang.RuntimeException: Unable to start activity ComponentInfo{george.frost.YourCarbDatabase/com.android.CarbCount.Search}: java.lang.IllegalArgumentException: column '_id' does not exist
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.os.Looper.loop(Looper.java:130)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread.main(ActivityThread.java:3701)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at java.lang.reflect.Method.invokeNative(Native Method)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at java.lang.reflect.Method.invoke(Method.java:507)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at dalvik.system.NativeStart.main(Native Method)
12-03 17:18:41.557: E/AndroidRuntime(30413): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.widget.CursorAdapter.init(CursorAdapter.java:111)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.widget.CursorAdapter.<init>(CursorAdapter.java:90)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:47)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:84)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at com.android.CarbCount.Search.onCreate(Search.java:42)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-03 17:18:41.557: E/AndroidRuntime(30413):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
12-03 17:18:41.557: E/AndroidRuntime(30413):    ... 11 more

【问题讨论】:

  • 您能否将堆栈跟踪与 startManagingCursor 中的代码一起发布?

标签: java android sqlite listview


【解决方案1】:

startManagingCursor()-方法已弃用。您应该改用Loader API。如果您的目标设备的 API 级别低于 11,则需要使用 compatibility library

由于您只想从 SQLiteDatabase 加载一些数据,因此您无需创建 ContentProvider,但可以扩展 Loader。可以在此处找到示例和更多信息:CursorLoader usage without ContentProvider

此外,如果您的 Activity 仅显示 ListView,您可能需要切换到 ListActivity,因为它可以让您更轻松地绑定数据和获取 ID(例如)。


自从你发布了你的 LogCat:

问题是,SimpleCursorAdapter-class 需要一个名为 _id 的列来获取数据库中每一行数据的 ID。可以在此处找到有关该问题的更多信息:Android column '_id' does not exist?

【讨论】:

  • 谢谢,我不知道 startManagingCursor() 方法被贬值了。尽管我的布局在顶部包含一个按钮,在下面包含一个列表视图,但我已经扩展了 ListActivity。是的,我只想加载一列数据并将其显示在列表视图中
【解决方案2】:

你的表是否包含带有主键的列... logcat 的第一行说....

12-03 17:18:41.557: E/AndroidRuntime(30413): java.lang.RuntimeException: Unable to start activity ComponentInfo{george.frost.YourCarbDatabase/com.android.CarbCount.Search}: java.lang.IllegalArgumentException: column '_id' does not exist  

看到这个....

 column '_id' does not exist

【讨论】:

  • 游标使用 _id 识别条目,所以如果你使用类似这样的总和,sqlite 中的表必须包含这个......
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2011-05-30
  • 2018-10-19
相关资源
最近更新 更多