簡體   English   中英

從 SQLite 數據庫 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 列。
因此,除非i0 ,否則不應使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM