【问题标题】:Make sure the Cursor is initialized correctly before accessing data from it. sql android确保在从光标访问数据之前正确初始化光标。 sql 安卓
【发布时间】:2017-05-19 13:18:36
【问题描述】:
public class recordd extends Activity{


    Button b;
    int count;
    String date;
    Record record;
    SQLiteDatabase db;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.record);

        int calo =getIntent().getIntExtra("cal", 0);

        TextView TEXT =(TextView)findViewById(R.id.record);


        record= new Record(this);
        db= record.getWritableDatabase();
        db.execSQL("INSERT INTO tab VALUES (null, 'calo' ,null);");

        Cursor cursor = db.rawQuery("SELECT SUM(cal) FROM tab ", null);


        while(cursor.moveToNext()){
            int addr = cursor.getInt(0);
            String addrrr = Integer.toString(addr);
            String abc = cursor.getString(2);
        }

我从上次活动中得到了“calo”。然后将该数字放入名称为tab的sql表中。然后制作一个光标来对包含 calo 信息的 cal 进行求和。 但是有一个问题。

“原因:java.lang.IllegalStateException:无法读取第 0 行,col 2 来自光标窗口。确保光标已正确初始化 在从中访问数据之前。”

这是创建表的更多信息。

public class Record extends SQLiteOpenHelper {

    static final String DATABASE_NAME = "mydb.db"; 
    static final int DATABASE_VERSION = 1; 




    public Record(Context context){

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }




    @Override

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE tab ( _id INTEGER PRIMARY KEY AUTOINCREMENT, "
                +"cal INTEGER, timestamp DATE DEFAULT (datetime('now','localtime')));");
    }

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS tab;");
        onCreate(db);
    }



}

我已经甩了好几天了

【问题讨论】:

  • 基于SQL 查询,结果游标将只包含一行,而这一行将只有一列。问题是您试图获取不存在的第三列cursor.getString(2);
  • 我忘记了问题所在。根据日志,String abc = cursor.getString(2);有这个问题“由:java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行,第 2 行。确保在从光标访问数据之前正确初始化光标。”
  • 感谢泰特斯。那么我如何从 sql 表中得到总和....
  • 我认为该表将像这样创建 - 1 100 2016/05/22 - 2 150 2016/5/23 - 3 100 2016/5/29 并想总结第二部分.. .
  • 在您发布的代码中,addrrr 将包含tab 表的cal 列的总和。只需删除此行 String abc = cursor.getString(2); 即可。

标签: java android sql


【解决方案1】:

我遇到了类似的错误,并为我的类似问题提供了这个答案,以防有人遇到同样的问题。

我正在使用 SQLiteAssetHelper,并且我的 SQL 调用设置如下:

 public Cursor getStateData() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    String [] sqlSelect = {"0 _id", "state", "iconone" };
    String sqlTables = "Reefs";
    qb.setTables(sqlTables);
    qb.setDistinct(true);
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);
    c.moveToFirst();
    return c;
}

我将调用添加到我的 SQL 表中第 6 列中的第二列数据,因此假设我应该按如下方式进行调用:

 do
    {
        dataprovider = new StateDataProvider(statesData.getString(1), statesData.getString(6));
        arrayList.add(dataprovider);
    } while (statesData.moveToNext());

不是这样,您不会调用第 6 列,而是调用第二个 sqlSelect,如下所示:

 do
    {
        dataprovider = new StateDataProvider(statesData.getString(1), statesData.getString(2));
        arrayList.add(dataprovider);
    } while (statesData.moveToNext());

希望它可以节省我在此错误上花费的许多徒劳的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2018-02-27
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多