![](/img/trans.png)
[英]Reading Data from SQLite Database to a new Activity - Android Studio
[英]Error with reading data from SQLite database Android Studio
我正在尝试从我在 android 工作室创建的 SQLite 数据库中读取数据。 我不断收到错误“原因:android.database.CursorIndexOutOfBoundsException:请求索引 0,大小为 0”。 我认为这与我的 ReadData Function 有关,但我不确定需要修复什么。 我正在尝试从特定列的特定行读取数据到另一个活动中的变量。 数据库已连接,但我试图传递给其他活动的数据给了我一个错误。 如果需要更多解释,请告诉我。
---------这是我的活动中的行,它在 BallProcessDataActivity 的第 980 行中给了我错误
distance = databaseHelper.ReadData(i,"distance").getFloat(i);
--------------在我的数据库助手 JAVA 类中---------
public Cursor ReadData(int rowNum, String columnName){
String query = "SELECT '" + columnName + "'"+ " FROM " + TABLE_NAME + " WHERE ID = '" + rowNum + "';";
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
Cursor res = sqLiteDatabase.rawQuery(query, null);
res.close();
return res;
}
----------------------这是我收到的错误--
2020-07-30 12:51:27.238 17801-17801/wtzn.wtbtble901 E/AndroidRuntime: FATAL EXCEPTION: main
Process: wtzn.wtbtble901, PID: 17801
java.lang.RuntimeException: Unable to start activity ComponentInfo{wtzn.wtbtble901/wtzn.wtbtble901.BallProcessDataActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
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:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:515)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:138)
at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:76)
at wtzn.wtbtble901.BallProcessDataActivity.ShotAnalyze(BallProcessDataActivity.java:980)
at wtzn.wtbtble901.BallProcessDataActivity.onCreate(BallProcessDataActivity.java:969)
at android.app.Activity.performCreate(Activity.java:7825)
at android.app.Activity.performCreate(Activity.java:7814)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
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:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
您可以检查结果集中的数量或行数
Cursor res = sqLiteDatabase.rawQuery(query, null);
if (res.getCount() > 0) {
res.moveToPosition(rowNum);
} else {
// error
}
假设ID
是您的表的主键,您的查询(如果它在语法上是正确的)将只返回 1 行和 1 列。
因此,除非i
为0
,否则不应使用i
作为getFloat(i)
的参数,因为唯一列的索引是0
。
此外,您不应关闭您的方法返回的Cursor
。
您可以在调用该方法后关闭它并在不再需要时使用它。 在您的查询中,您不能在列名周围连接单引号并使用?
参数rowNum
的占位符:
public Cursor ReadData(int rowNum, String columnName){
String query = "SELECT " + columnName + " FROM " + TABLE_NAME + " WHERE ID = ?";
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
Cursor res = sqLiteDatabase.rawQuery(query, new String[] {String.valueOf(rowNum)});
return res;
}
现在像这样调用方法ReadData()
:
Cursor c = databaseHelper.ReadData(i, "distance");
if (c.moveToFirst()) distance = c.getFloat(0);
c.close();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.