我使应用程序和编译器显示错误。我不知道发生了什么。我想在点击后从数据库中检索并显示随机记录。 我使用了来自Android SQLite Database Tutorial和stackoverflov的教程 错误:
10-30 19:19:59.533: E/AndroidRuntime(359): FATAL EXCEPTION: main
10-30 19:19:59.533: E/AndroidRuntime(359): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
10-30 19:19:59.533: E/AndroidRuntime(359): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
我的代码是:
public class PrzyslowiaArabskie {
private static final String TABLE_NAME = "tabela_przyslowia";
private static final String DATABASE_NAME = "przyslowiadb";
private static final int DATABASE_VERSION = 1;
public static final String KEY_ID = "id";
public static final String KEY_PRZYSLOWIE = "przyslowie";
private DbHelper myHelper;
private final Context myContext;
private SQLiteDatabase myDatabase;
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_PRZYSLOWIE + " TEXT NOT NULL);" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
public PrzyslowiaArabskie(Context c) {
myContext = c;
}
public PrzyslowiaArabskie open() {
myHelper = new DbHelper(myContext);
myDatabase = myHelper.getWritableDatabase();
return this;
}
public void close() {
myHelper.close();
}
public String getData() {
// TODO Auto-generated method stub
String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
if (c != null) {
c.moveToFirst();
String data = c.getString(1);
return data;
}
return null;
}
}
我做错了什么?
我解决了我的问题。而是从数据库中获取随机记录,我制作了3个按钮(下一个记录,以前的记录和节目记录)。我使用此说明Getting the next record into view from database 谢谢你的帮助。
答案 0 :(得分:2)
光标始终不为空。相反,moveToFirst
有时会失败。
尝试
if(c.moveToFirst() {
String data = c.getString(c.getColumnIndexOrThrow(KEY_PRZYSLOWIE ));
}
答案 1 :(得分:2)
您正在尝试索引到不存在的游标行上的列。
if (c != null) {
c.moveToFirst(); // This needs to check for validity
String data = c.getString(1); // Before indexing into a non-existent record
return data;
}
,而不是...
if(c.moveToFirst()){
String data = c.getString(1);
return data;
}
当然,如果您打算迭代多行,您可能需要考虑while循环并使用while(c.moveToNext()) ...
修改:地址评论的扩展答案。
要使用while循环迭代通过游标可用的所有记录并利用使用者代码中的数据,您可能必须更改方法签名以返回排序集合而不是单个字符串。
public ArrayList<String> getData() {
ArrayList<String> data = new ArrayList<String>();
String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
while(null != c && c.moveToNext()) {
data.add(c.getString(1));
}
return data;
}
提供的示例代码应该可以获得您想要的结果但是如果您需要有关处理对象集合和while循环的更多解释,我建议您查阅有关处理的Java documentation for some information或更多抽象编程信息数据结构和控制流程。
答案 2 :(得分:0)
更改
if (c != null) {
到
if (c != null && c.moveToFirst()) {
否则,即使没有匹配的行,您也会尝试从游标中获取数据。
答案 3 :(得分:0)
看起来你有一个空光标。不要检查它是否为空,请尝试检查
if(mCursor.getCount > 0)
{
//do stuff
}