如果已经设置(插入)了一个选项(例如音量,振动),我的程序就会检查选项表。基本上,如果未设置选项,则表中的第一列为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()。的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;
}
`
答案 0 :(得分:2)
您正在尝试从Cursor
获取空的数据(0行),这会抛出该异常。我看到了您的其他问题,并且我已经看到id
表格中的options
列设置为INTEGER PRIMARY KEY AUTOINCREMENT
。 AUTOINCREMENT 表示每次在数据库中插入行时此列都会递增其值,我认为它也是从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();