安卓SQLLiteDataBase游标返回0行

4

我尽力了,但是我无法获取到光标返回的任何数据。我已经确认数据库中有数据并且插入操作正常。官方错误提示如下:

CursorIndexOutOfBoundsException: 索引为0,大小为0

顶级声明:

private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBAdapter(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
    this.db = this.DBHelper.getWritableDatabase();
}

我的功能:

public String getRandomEntry()
    {
    int rand;
    Random random = new Random();
    int numEntries = (int)this.getCount();

    if(numEntries == 0)
        return "ERROR: Database is empty.";
    rand = random.nextInt(numEntries);

    Cursor cursor = DBHelper.getWritableDatabase().rawQuery(
            "SELECT * FROM " + DATABASE_TABLE 
            + " WHERE " + COLUMN_A + " = " + 0, null);

    Log.i("numEntries", Integer.toString(numEntries));
    Log.i("rand", Integer.toString(rand));
    Log.i("cursor", Integer.toString(cursor.getCount()));

    cursor.moveToFirst();
    return cursor.getString(0);
}

我也尝试过这样抓取光标:
Cursor cursor = db.rawQuery(
            "SELECT * FROM " + DATABASE_TABLE 
            + " WHERE " + COLUMN_A + " = " + 0, null);

请给我您的想法!谢谢!!

(这段话无需翻译)

在数据库中,COLUMN_A = 0是什么意思?rand是用来做什么的? - Stuck
STRING COLUMN_A = "_id";,抱歉,我应该包括它。 - RedLeader
我去掉了随机数,以便将问题隔离到游标上。无论我寻找COLUMN_A = 0,1,2...(其中COLUMN_A是数据库中的_id列)。 - RedLeader
2个回答

2

首先尝试使用以下方式进行查询:

String args[] = new String[]{"0"};

Cursor cursor = db.rawQuery(
        "SELECT * FROM " + DATABASE_TABLE + " WHERE " + COLUMN_A + " = ?", args);

如果这没有帮助,请使用外部工具检查您的数据库,以查看是否返回行。

2

这里似乎没有任何随机性。每次看起来你都在寻找column_a的值为0。

我会认为column_a中没有任何值为0的内容。


我去掉了随机数,以便将问题隔离到游标上。无论我寻找COLUMN_A = 0,1,2...(其中COLUMN_A是数据库中的_id列)。 - RedLeader
如果您不添加“where”子句,游标会是什么样子? - nicholas.hauschild
添加了两条记录。没有“where”条件,日志正确地报告了cursor.getCount() = 2。 - RedLeader
什么是ids?你能否使用游标中的其中一个id运行where语句? - nicholas.hauschild
我想我找到了问题所在,我按如下方式创建了表:`private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + "(" + COLUMN_A + " " + TYPE_A + ", " + COLUMN_B + " " + TYPE_B + ", " + COLUMN_C + " " + TYPE_C + ", " + COLUMN_D + " " + TYPE_D + ");";`其中: public static final String TYPE_A = "INTEGER PRIMARY KEY AUTOINCREMENT";每次运行(或者甚至只是进行 db.delete 操作),Autoincrement 都没有被重置,因此现在正在添加记录 45、46、47 等等...我该如何重置 Autoincrement? - RedLeader
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接