【问题标题】:Error when trying to use cursor to get integer values from SQLite in Android尝试使用游标从 Android 中的 SQLite 获取整数值时出错
【发布时间】:2022-03-17 21:33:32
【问题描述】:

我正在尝试获取整数值,以便使用游标从 SQLlite 的列表视图中显示,但它显示以下错误:

java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行第 4 列。确保 Cursor 在从中访问数据之前已正确初始化。

这是我的代码

MyItems.java:

public  ArrayList<SalesItemInformationLV> retrieveAllForlist(Context c)
{
    ArrayList<SalesItemInformationLV> items = new ArrayList<SalesItemInformationLV>();

    Cursor myCursor;
    String mystring = "";

    MyDbAdapter db = new MyDbAdapter(c);
    db.open();
    //contactIdList.clear();
    //contactList.clear();
    myCursor = db.retrieveAllEntriesCursor();

    if (myCursor != null && myCursor.getCount() > 0)
    {
        myCursor.moveToFirst();
        do {
            contactIdList.add(myCursor.getInt(db.COLUMN_KEY_ID));
            items.add(new SalesItemInformationLV(myCursor.getString(db.COLUMN_NAME_ID), myCursor.getInt(db.COLUMN_QTYSOLD_ID)));
        } while (myCursor.moveToNext());
    }
    db.close();

    return items;
}

MyDbAdapter.java:

private SQLiteDatabase _db;
private final Context context;

public static final String KEY_ID = "_id";
public static final int COLUMN_KEY_ID = 0;
public static final String ENTRY_NAME = "entry_name";
public static final int COLUMN_NAME_ID = 1;
public static final String ENTRY_QTYSOLD = "entry_qtysold";
public static final int COLUMN_QTYSOLD_ID = 4;

private MyDBOpenHelper dbHelper;
//private MyDBOpenHelper dbHelper2;

public MyDbAdapter(Context _context)
{
    this.context = _context;
    
    //step 16 - create MyDBOpenHelper object
    //constructor
    dbHelper = new MyDBOpenHelper(context, DATABASE_NAMEA, null, DATABASE_VERSION);
    //constructor
    //dbHelper2 = new MyDBOpenHelper(context, DATABASE_NAME2, null, DATABASE_VERSION);
}

public Cursor retrieveAllEntriesCursor() {
    //step 21 - retrieve all records from table
    Cursor c = null;
    try {
        c = _db.query(DATABASE_TABLE, new String[] {KEY_ID, ENTRY_NAME}, null, null, null, null, null);

    }
    catch (SQLiteException e)
    {
        Log.w(MYDBADAPTER_LOG_CAT, "Retrieve fail!");
    }

    return c;
}

我怀疑错误来自 MyItems.java,但我很难弄清楚错误是什么。

【问题讨论】:

  • 您正在加载预定义的架构?
  • retrieveAllEntriesCursor() 方法的邮政编码也
  • @chandil03 它在第二个灰色框中
  • 如果可能的话发布你的架构
  • 您在 0 索引处获取 KEY_ID,而 COLUMN_KEY_ID 为 3,这就是发生此错误的原因。尝试使用 0 而不是 COLUMN_KEY_ID。它应该可以工作。

标签: java android sqlite android-cursor


【解决方案1】:

似乎您只从数据库中获取 2 列 (KEY_ID, ENTRY_NAME),而在读取时您期望 3 列。

 c = _db.query(DATABASE_TABLE, new String[] {KEY_ID, ENTRY_NAME}, null, null, null, null, null);

您正在尝试从第 4 列中获取值,这导致了错误。

public static final int COLUMN_QTYSOLD_ID = 4;

【讨论】:

  • 那么请检查列号的映射
【解决方案2】:

在你的数据库助手类中使用这个方法

public Cursor getalldata() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery(" select * from " + TABLE_Name, null);

    return res;


}

**并在您想从数据库表中获取数据的地方调用此方法**

 public void getdata(){

    Cursor res = db.getstafdata(); //db id an object of database helper //class
    if (res.getCount() == 0) {
        Toast.makeText(getApplicationContext(),
                "no data", Toast.LENGTH_LONG).show();

    } else {

        StringBuffer stbuff = new StringBuffer();
        while (res.moveToNext()) {

            detail.add(new doctor_details(res.getString(1),res.getString(2),res.getString(3)));

        }


}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多