【问题标题】:How to read more than one record of one row from SQLite table?如何从 SQLite 表中读取一行的多个记录?
【发布时间】:2012-02-07 10:00:42
【问题描述】:

我有一个名为 test_database 的数据库。 我得到了一张名为tbl_marks 的桌子。 在tbl_marks 中有以下行:

  • _id
  • 姓名
  • subid
  • gewicht
  • 基准

有 4 个条目。两个 subid 为 1,另外两个 subid 为 2。

现在我喜欢做以下事情:

SELECT * FROM tbl_marks WHERE subid = 1;

所以最后我想用subid 1, 2, 3 或任何在列表视图中列出所有标记。

如何通过光标做到这一点?

我试图通过教程来学习它,但它失败了......

Higherpass Android Tutorial Accessing-Data-With-Android-Cursors

Anddev Working with the sqlite database - Cursors

代码:注释部分是我之前得到的(它列出了所有内容)

private void fillData() {
    // Get all of the notes from the database and create the item list

    mDbHelper.open_database_rw();
    Cursor mCursor = db.rawQuery("SELECT _id, subid, name, mark, gewicht, datum FROM tbl_marks ORDER BY subid;", null);
    startManagingCursor(mCursor);
    if (mCursor != null) {
         int intName = mCursor.getColumnIndexOrThrow("subid");

          do {
              teststring = mCursor.getString(intName);

              String[] from = new String[] { dbHelper.KEY_NAME_MARKS, dbHelper.KEY_MARK_MARKS, dbHelper.KEY_GEWICHT_MARKS, dbHelper.KEY_DATUM_MARKS};
              int[] to = new int[] {R.id.txt_marks_row, R.id.txt_note, R.id.txt_gewicht, R.id.txt_datum};


              SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_marks, mCursor, from, to);
              setListAdapter(notes);
          } while (mCursor.moveToNext());

    }

LogCat 说 subid 列不存在。但它就在那里,并且数据库已经打开。

02-07 11:30:00.500: D/dalvikvm(9913): GC_EXTERNAL_ALLOC freed 54K, 50% free 2694K/5379K, external 0K/0K, paused 56ms
02-07 11:30:00.535: D/dalvikvm(9913): GC_EXTERNAL_ALLOC freed 4K, 50% free 2698K/5379K, external 13K/523K, paused 27ms
02-07 11:30:10.457: D/AndroidRuntime(9913): Shutting down VM
02-07 11:30:10.457: W/dalvikvm(9913): threadid=1: thread exiting with uncaught exception (group=0x40235568)
02-07 11:30:10.457: E/AndroidRuntime(9913): FATAL EXCEPTION: main
02-07 11:30:10.457: E/AndroidRuntime(9913): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.marco.notenha/test.marco.notenha.mark}: java.lang.IllegalArgumentException: column 'subid' does not exist
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1664)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.os.Looper.loop(Looper.java:130)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread.main(ActivityThread.java:3703)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at java.lang.reflect.Method.invokeNative(Native Method)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at java.lang.reflect.Method.invoke(Method.java:507)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at dalvik.system.NativeStart.main(Native Method)
02-07 11:30:10.457: E/AndroidRuntime(9913): Caused by: java.lang.IllegalArgumentException: column 'subid' does not exist
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at test.marco.notenha.mark.fillData(mark.java:180)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at test.marco.notenha.mark.onCreate(mark.java:70)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-07 11:30:10.457: E/AndroidRuntime(9913):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628)
02-07 11:30:10.457: E/AndroidRuntime(9913):     ... 11 more

这是第 180 行: int intName = mCursor.getColumnIndexOrThrow("subid");

02-07 11:52:26.304: D/dalvikvm(10075): GC_EXTERNAL_ALLOC freed 48K, 50% free 2694K/5379K, external 0K/0K, paused 38ms
02-07 11:52:26.339: D/dalvikvm(10075): GC_EXTERNAL_ALLOC freed 4K, 50% free 2698K/5379K, external 13K/523K, paused 30ms
02-07 11:52:29.433: D/AndroidRuntime(10075): Shutting down VM
02-07 11:52:29.433: W/dalvikvm(10075): threadid=1: thread exiting with uncaught exception (group=0x40235568)
02-07 11:52:29.437: E/AndroidRuntime(10075): FATAL EXCEPTION: main
02-07 11:52:29.437: E/AndroidRuntime(10075): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.marco.notenha/test.marco.notenha.mark}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1664)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.os.Looper.loop(Looper.java:130)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread.main(ActivityThread.java:3703)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at java.lang.reflect.Method.invokeNative(Native Method)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at java.lang.reflect.Method.invoke(Method.java:507)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at dalvik.system.NativeStart.main(Native Method)
02-07 11:52:29.437: E/AndroidRuntime(10075): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at test.marco.notenha.mark.fillData(mark.java:183)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at test.marco.notenha.mark.onCreate(mark.java:70)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-07 11:52:29.437: E/AndroidRuntime(10075):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628)
02-07 11:52:29.437: E/AndroidRuntime(10075):    ... 11 more

【问题讨论】:

    标签: android database sqlite cursor where


    【解决方案1】:

    “subid”列必须在 SELECT 列列表中,以便 mCursor.getColumnIndexOrThrow("subid") 调用返回它:

    SELECT _id, name, mark, gewicht, datum, subid FROM tbl_marks ORDER BY subid;
    

    编辑:

    现在您需要调用 mCursor.moveToFirst() 并检查它是否返回“true”(即结果列表不为空)。见this question。举个例子:

    if (mCursor != null && mCursor.moveToFirst()) {
        int intName = mCursor.getColumnIndexOrThrow("subid");
        do {
              teststring = mCursor.getString(intName);
    
              ...
        } while (mCursor.moveToNext());
    }
    

    【讨论】:

    • 谢谢我这样做了!但是现在我又遇到了一个错误:Index -1 requested, with a size of 3. LogCat View has been added
    • 查看我的答案的更新,你需要定位你的光标并检查查询结果是否为空。
    • 谢谢老兄,它不会再崩溃了 :) 我将尝试仅获取带有 subid x 的值并列出它们,并在另一侧使用另一个 subid。希望我能做到!
    【解决方案2】:

    你可以使用这个查询

    SELECT * FROM tbl_marks order by subid
    

    然后通过使用光标,您可以检索您想要的记录。

    【讨论】:

    • 我对 SQL、DDL 或 DML 没有任何问题。我只是不知道如何通过表格阅读它们并列出它们。我确实添加了一些代码。不过谢谢你的回答!
    • 现在出现以下错误:请求索引 -1,大小为 3
    【解决方案3】:
    myDB = openOrCreateDatabase("tbl_marks", MODE_PRIVATE, null);
    
    
    Cursor mCursor = myDB.rawQuery("SELECT _id, name FROM tbl_marks ORDER BY name;", null);
    startManagingCursor(mCursor);
    if (myCursor != null) {
         int intName = myCursor.getColumnIndexOrThrow("name");
         if(mCursor.moveToFirst()){
              String strName = myCursor.getString(intName);
    
         /* do {
              String strName = myCursor.getString(intName);
            } while (myCursor.moveToNext());*/ 
    
        }
    
    }
    

    如果你想在列表视图中显示结果:

    myDB = openOrCreateDatabase("tbl_marks", MODE_PRIVATE, null);
    
    
    Cursor mCursor = myDB.rawQuery("SELECT name, mark, gewicht, datum FROM tbl_marks ORDER BY subid;", null);
    startManagingCursor(mCursor);
    if(mCursor.moveToFirst()){
        ListView lv = (ListView)findViewById(R.id.listview);
        ListAdapter adapter = new SimpleCursorAdapter(
                            this, // Context.
                            android.R.layout.simple_list_item_1,
                            mCursor,
                            new String[] {"name"},
                            new int[] {android.R.id.text1});
    
        lv.setAdapter(adapter);
    }
    

    【讨论】:

    • 我不是要等一会儿吗?因为我必须用 subid x 读取每条记录。
    • 我编辑了我的答案。而且我认为缺少一些尝试/捕获。但我认为日食(或你正在使用的任何东西)也会告诉你。 :)
    • 我试过了。但是仍然有一个我无法弄清楚的错误。我编辑了我的问题并发布了 logcat 视图。
    • 请求索引-1,大小为3
    • 确定列名真的是'subid'?我注意到的是,您有一个空选择:“SELECT _id, , [...]”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2022-10-04
    • 2020-10-08
    • 2011-12-19
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多