Retreive/get 在 SQLite 中按 id 行,android studio 不工作

Retreive/get row by id in SQLite, android studio doesn't work

我正在尝试从 android studio 中的 SQLite 数据库中获取数据。我尝试调用的方法如下所示:

 public Cursor getDataById(int id){
    SQLiteDatabase db=this.getWritableDatabase();
    String query="SELECT * FROM "+TABLE_NAME+" where receipt_id="+id;
    Cursor data=db.rawQuery(query,null);
    return data;
}

private void addComponentsAndData(){
        Cursor data=databaseService.getDataById(selectedId);

        System.out.println(data.getString(1));

        for(int i=0;i<8;i++){
            TextView textView=new TextView(this);
            switch(i){
                case 0:
                    textView.setText("ID tankowania: "+data.getString(i)+"\r\n");
                    break;
                case 1:
                    textView.setText("Data i czas tankowania: "+data.getString(i)+"\r\n");
                    break;
                case 2:
                    textView.setText("Rodzaj paliwa: "+data.getString(i)+"\r\n");
                    break;
                case 3:
                    textView.setText("Ilość paliwa: "+data.getString(i)+" l.\r\n");
                    break;
                case 4:
                    textView.setText("Kwota za litr: "+data.getString(i)+" zł\r\n");
                    break;
                case 5:
                    textView.setText("Kwota całości: "+data.getString(i)+" zł\r\n");
                    break;
                case 6:
                    textView.setText("Nazwa stacji: "+data.getString(i)+"\r\n");
                    break;
                case 7:
                    textView.setText("Numer rejestracyjny*: "+data.getString(i)+"\r\n");
                    break;
            }
            textView.setTextSize(20);
            linearLayout.addView(textView);
        }
}

数据库看起来像:

此外,当我尝试调用方法时,returns 所有数据都有效:

public Cursor getData(){
    SQLiteDatabase db=this.getWritableDatabase();
    String query="SELECT * FROM "+TABLE_NAME;
    Cursor data=db.rawQuery(query,null);
    return data;
}

我遇到的异常如下所示:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.recepitscannerapp, PID: 5410
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.recepitscannerapp/com.app.recepitscannerapp.HistorySelected}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:514)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:138)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:52)
    at com.app.recepitscannerapp.HistorySelected.addComponentsAndData(HistorySelected.java:41)
    at com.app.recepitscannerapp.HistorySelected.onCreate(HistorySelected.java:35)
    at android.app.Activity.performCreate(Activity.java:8000)
    at android.app.Activity.performCreate(Activity.java:7984)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

以前有人遇到过这样的问题吗?我想我犯了一个简单的错误,但我已经尝试了多种方法来修复它,但它没有用...

获得光标 data 后:

Cursor data=databaseService.getDataById(selectedId);

游标的索引位于它包含的行的第一行之前。
在尝试使用 data.getString():

获取任何列值之前,您必须调用 moveToFirst() 在第一行设置索引
private void addComponentsAndData() {
    Cursor data=databaseService.getDataById(selectedId);
    if (!data.moveToFirst()) return;
    System.out.println(data.getString(1));
    ......................................
}

我还在图像中看到 table 中有 7 列,但是代码中的 for 循环进行了 8 次迭代以访问 8 列。
您应该更改为:

for(int i=0;i<7;i++) {
    .................
}

此外,将参数传递给 rawQuery() 的推荐方法是使用 ? 占位符并将参数值作为字符串数组:

public Cursor getDataById(int id){
    SQLiteDatabase db=this.getWritableDatabase();
    String query="SELECT * FROM "+TABLE_NAME+" where receipt_id=?";
    Cursor data=db.rawQuery(query,new String[] {String.valueOf(id)});
    return data;
}