0

如果我的程序已经设置(插入)一个选项(例如音量,振动),我的程序应该检查选项表。基本上,如果未设置选项,则表中的第一列为 0。如果第一行为空,则切换到默认选项,否则,切换到选项集。我用 try catch 包围我的选项检查器并收到此错误:

CursorIndexOutOfBoundsException:请求索引 0,大小为 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()。爪哇:

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;
}

`

4

1 回答 1

2

您正在尝试从Cursor空(0 行)中获取数据,这会引发该异常。我看到了您的其他问题,并且看到您idoptions表格中的列设置为INTEGER PRIMARY KEY AUTOINCREMENT. AUTOINCREMENT意味着每次在数据库中插入一行时,该列的值都会增加,我认为它也是从 0 以上的值开始的(不确定)。这意味着您在该getId方法中进行的查询将始终返回一个空Cursor(您查询具有id0 但数据库中没有的行)。

我不明白你问题的第一部分,即在数据库中插入/未插入并切换到默认值的问题,所以我可以说如何做你想做的事。

这是一些示例代码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();
于 2012-04-08T16:55:19.290 回答