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;
}
我正在尝试从 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);
}
}
数据库看起来像:
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;
}