2012-04-08 94 views
0

我的計劃是想檢查的選項表,如果它已經被設置(插入)的選項(如音量,振動)的。基本上,如果沒有設置選項,表格中的第一列爲0.如果第一行爲空,則切換到默認選項,否則切換到選項集。我環繞我的選擇檢查者使用嘗試捕捉一個收到此錯誤:所以我不知道如果我的代碼是對我的需要的Android - 光標索引越界異常

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0.

我仍然福利局這個SQL的東西。

這是在OnCreate中(我的選項檢查):

options = new DBFunctions(this); 

    try{ 
    String row = "0".toString(); 
    long l = Long.parseLong(row); 
    options.open(); 
    String retId = options.getId(l); 
    int id = Integer.parseInt(retId); 
    options.close(); 
    //codes for setting the options if/if no data in option table exists will be put here 
    }catch(Exception e){ 
    String error = e.toString(); 
    tv.setText(error); 
}  

這是我在我的DBFunctions的getId()。 Java的:

public String getId(long l) { 

    String[] columns = new String[]{"id", "volume", "vibrate", "theme"}; 
    Cursor c = db.query(table, columns, "id=" + l, null, null, null, null); 
    if(c !=null){ 
     c.moveToFirst(); 
     String id = c.getString(1); 
     return id; 
    } 
    return null; 
} 

`

回答

2

你試圖從Cursor是空的(0行)獲取的數據,這拋出異常。我看到你的其他問題,我已經看到了你在optionsid列設置爲INTEGER PRIMARY KEY AUTOINCREMENTAUTOINCREMENT意味着本專欄將每行插入數據庫時​​增加它的價值,我認爲它也開始在高於0(不知道)的值。這意味着你在getId方法使查詢總是會返回一個空Cursor(您查詢的行與id 0,但在數據庫中是沒有的)。

我不明白你的問題的第一部分中的一個插入/數據庫中未插入並切換到默認值,所以我可以說怎麼做你想做的。

下面是一些示例代碼SharedPreferences

// When you want to check the status of the options 
SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(this); //in an activity 
    // volumeStatus, vibrateStatus and themeStatus represent the current status of the options 
boolean volumeStatus = prefs.getBoolean("volume_key", false); // if volumeStatus is false it is the first app run or the user put the volume to off 
boolean vibrateStatus = prefs.getBoolean("vibrate_key", false); // the same as for volumestatus 
String themeStatus = prefs.getString("theme_key", null); // if themeStatus is null it is the first run of the app or the user didn't choose a theme 

    // when the user modifies one of the preferences use this 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putBoolean("volume_key", true); // the use sets the volume to on like in the database 
      editor.commit(); 
+0

感謝我的其他問題,檢查了.. :)我已經嘗試過的顯示值創建一個按鈕,它顯示所有我輸入的數據,這意味着我的插入代碼是正確的。然後我嘗試了我的值檢查器(我的代碼如上),它仍然顯示錯誤。我也嘗試將我正在查找的行(之前爲0)更改爲1,仍然顯示錯誤.. – 2012-04-08 17:51:33

+0

@PhilipSy檢查您的數據並在數據庫中放入一個ID,然後使用該ID進行查詢。問題是,我不明白你想做什麼:用戶在數據庫中插入設置(只有一個,很多等?!?),但如果第一行是空的(?!?)切換到默認值? !? – Luksprog 2012-04-08 17:59:51

+0

「我不明白你的問題的第一部分是插入/未插入數據庫並切換到默認值,因此我可以說如何做你想做的事情。」 - 我的意思是,如果您第一次使用該應用程序,它將設置默認選項(振動開啓,音量開啓等)。如果您設置了選項,它會檢查您是否已經設置過。如果它檢測到選項表有一個值,它只會更新您的選項,否則如果沒有值,它會插入。基本上,我的選擇表應包括1個排.. – 2012-04-08 18:00:13