【问题标题】:Displaying items in listView from sqlite database (Android)从 sqlite 数据库(Android)的 listView 中显示项目
【发布时间】:2015-05-02 19:44:26
【问题描述】:

我正在尝试在 android 上填充列表视图。我已经编写了代码并且它运行没有错误,但是当我尝试运行它时它崩溃了。下面是填充列表视图方法:

 private void populateListView() {
    Cursor cursor = db.getAllRows();
    String[] fromFieldNames = new String[]{MySQLiteHelper.KEY_TITLE, MySQLiteHelper.KEY_AUTHOR};
    int[] toViewIDs = new int[]{R.id.textView2, R.id.textView3};
    SimpleCursorAdapter myCursorAdapter;
    myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.itemlayout,cursor,fromFieldNames,toViewIDs,0);
    listView.setAdapter(myCursorAdapter);
}

这是我的 SQLiteHelper 类中的 getAllRows 函数

 public Cursor getAllRows()
{
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT * FROM " + TABLE_BOOKS;
    Cursor cursor = db.rawQuery(query, null);
    if(cursor!=null)
    {
       cursor.moveToFirst();
    }
   return cursor;
}

从崩溃报告来看,错误似乎来自:

 myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.itemlayout,cursor,fromFieldNames,toViewIDs,0);

错误日志是:

05-02 05:07:15.395    1882-1882/com.example.user.databasetutorial I/art﹕ Not late-enabling -Xcheck:jni (already on)
05-02 05:07:15.571    1882-1894/com.example.user.databasetutorial I/art﹕ WaitForGcToComplete blocked for 31.000ms for cause Background
05-02 05:07:15.720    1882-1894/com.example.user.databasetutorial W/art﹕ Suspending all threads took: 19.028ms
05-02 05:07:15.726    1882-1894/com.example.user.databasetutorial I/art﹕ Background partial concurrent mark sweep GC freed 269(47KB) AllocSpace objects, 0(0B) LOS objects, 47% free, 562KB/1074KB, paused 20.265ms total 77.611ms
05-02 05:07:16.035    1882-1882/com.example.user.databasetutorial D/AndroidRuntime﹕ Shutting down VM
05-02 05:07:16.035    1882-1882/com.example.user.databasetutorial E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.user.databasetutorial, PID: 1882
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.databasetutorial/com.example.user.databasetutorial.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
            at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
            at android.widget.CursorAdapter.init(CursorAdapter.java:172)
            at android.widget.CursorAdapter.<init>(CursorAdapter.java:149)
            at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:91)
            at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:104)
            at com.example.user.databasetutorial.MainActivity.populateListView(MainActivity.java:108)
            at com.example.user.databasetutorial.MainActivity.onCreate(MainActivity.java:53)
            at android.app.Activity.performCreate(Activity.java:5937)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我似乎无法弄清楚问题所在。谢谢

【问题讨论】:

  • 请发布错误日志
  • @abhishesh 我已经发布了错误日志。谢谢。
  • 您不需要将光标移动到第一行。删除cursor.moveToFirst() 并尝试。
  • @abhishesh 成功了。非常感谢

标签: android sqlite listview android-cursoradapter


【解决方案1】:

游标必须包含名为“_id”的列,否则此类将不起作用。

将您的选择查询修改为

String query = "Select rowid as _id,title,author from " + TABLE_BOOKS;

【讨论】:

猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多