有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从SQLite数据库Android Studio读取数据时发生java错误

我正在尝试从我在安卓 studio中创建的SQLite数据库中读取数据。我一直收到错误“由以下原因引起:安卓.database.CursorIndexOutOfBoundsException:请求索引0,大小为0”。我假设它与我的ReadData函数有关,但我不确定需要修复什么。我正在尝试将特定列中特定行的数据读取到另一个活动中的变量。数据库已连接,但我试图传递给其他活动的数据给了我一个错误。如果需要更多的解释,请让我知道

------这是我的活动中给出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}: 安卓.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at 安卓.os.Handler.dispatchMessage(Handler.java:107)
        at 安卓.os.Looper.loop(Looper.java:214)
        at 安卓.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: 安卓.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at 安卓.database.AbstractCursor.checkPosition(AbstractCursor.java:515)
        at 安卓.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:138)
        at 安卓.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:76)
        at wtzn.wtbtble901.BallProcessDataActivity.ShotAnalyze(BallProcessDataActivity.java:980)
        at wtzn.wtbtble901.BallProcessDataActivity.onCreate(BallProcessDataActivity.java:969)
        at 安卓.app.Activity.performCreate(Activity.java:7825)
        at 安卓.app.Activity.performCreate(Activity.java:7814)
        at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
        at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at 安卓.os.Handler.dispatchMessage(Handler.java:107) 
        at 安卓.os.Looper.loop(Looper.java:214) 
        at 安卓.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

共 (2) 个答案

  1. # 1 楼答案

    可以检查结果集中的行数

    Cursor res = sqLiteDatabase.rawQuery(query, null);
    if (res.getCount() > 0) {
       res.moveToPosition(rowNum);
    } else {
       // error
    }
    
  2. # 2 楼答案

    假设ID是表的主键,那么您的查询(如果语法正确)将只返回1行1列
    所以你不应该使用i作为getFloat(i)的参数,除非i0,因为唯一一列的索引是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();