如何从SQLite表中读取一行的多条记录?

发布于 2025-01-03 09:12:11 字数 7748 浏览 3 评论 0原文

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

  • _id
  • name
  • subid
  • gewicht
  • datum

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

现在我喜欢执行以下操作:

SELECT * FROM tbl_marks WHERE subid = 1;

所以最后我喜欢在列表视图中列出带有 subid 1、2、3 或其他内容的所有标记。

我怎样才能通过光标做到这一点?

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

Higherpass Android 教程使用 Android 光标访问数据

Anddev 使用 sqlite 数据库 - 游标

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

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

I got a database called test_database.
And I got a table called tbl_marks.
In tbl_marks there are following rows:

  • _id
  • name
  • subid
  • gewicht
  • datum

There are 4 entries. two with subid 1 and the other 2 with subid 2.

Now I like to do following:

SELECT * FROM tbl_marks WHERE subid = 1;

So finally I like to list all marks with subid 1, 2, 3 or what ever in a listview.

How can I do that by cursor?

I was trying to learn it by a tutorial but it failed...

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

Anddev Working with the sqlite database - Cursors

Code: The commented part is what I got before (it listed everything)

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 says that the column subid does not exists. But it's there and the db has been opened.

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

That's line 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

少跟Wǒ拽 2025-01-10 09:12:11

“subid”列必须位于 SELECT 列列表中,mCursor.getColumnIndexOrThrow("subid") 调用才能返回它:

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

编辑:

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

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

          ...
    } while (mCursor.moveToNext());
}

The "subid" column must be in the SELECT column list in order for the mCursor.getColumnIndexOrThrow("subid") call to return it:

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

Edit:

Now you need to call mCursor.moveToFirst() and check that it returns "true" (i.e. the result list is not empty). See this question. As an example:

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

          ...
    } while (mCursor.moveToNext());
}
平定天下 2025-01-10 09:12:11

您可以使用此查询

SELECT * FROM tbl_marks order by subid

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

You can use this query

SELECT * FROM tbl_marks order by subid

then by using the cursor you can retrieve the records tha you want.

泪之魂 2025-01-10 09:12:11
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);
}
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());*/ 

    }

}

if you wanna show the results in a listview:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文