游标适配器_id向前移动1

时间:2013-10-17 16:12:21

标签: android database android-cursoradapter

我在使用CursorAdapter时遇到了一些问题。

bindView()中,我以这种方式检索数据:

final String id = c.getString(c.getColumnIndexOrThrow(MySQLiteHelper.PROF_CONTACTS_KEY_ID));        
final String name = c.getString(c.getColumnIndexOrThrow(MySQLiteHelper.PROF_CONTACTS_KEY_NAME));

在此代码之后,我致电

Log.e("Log",id+" <=> "+name);

但是,由于一些奇怪的问题,我得到了一个ID向前移动了1。

这是DB中的情况(从模拟器中提取它,并使用SQLite Manager打开它):

Database situation

这是输出:

Logcat

随着数字越大(> 9),ID开始变得更加混乱:数字10变为数字1,数字13变为数字5等。 我不会遇到很多问题,事实上唯一不匹配的是id,所有其他信息都对应,但是我有一个详细的活动,我传递ID以便向用户显示详细信息。< / p>

这是我应用适配器的代码段:

    mCursor = mDb.rawGet("SELECT * FROM "+MySQLiteHelper.PROF_CONTACTS_TB_NAME+" LEFT JOIN "+
            MySQLiteHelper.EXAMS_TB_NAME+" ON "+
            MySQLiteHelper.PROF_CONTACTS_TB_NAME+"."+MySQLiteHelper.PROF_CONTACTS_KEY_COD_ESAME+"="+
                MySQLiteHelper.EXAMS_TB_NAME+"."+MySQLiteHelper.EXAMS_KEY_COD 
            + " ORDER BY " + MySQLiteHelper.PROF_CONTACTS_TB_NAME+"."+MySQLiteHelper.PROF_CONTACTS_KEY_ID);

    if (mCursor.getCount() == 0) {
        // error stuff.
    } else {

        String[] columns = new String[] {};
        int[] to = new int[] {};

        mDataAdapter = new CursorAdapterProfContacts(getSherlockActivity(), R.layout.item_prof_contact, mCursor, columns, to, 0);
        mLvContacts.setAdapter(mDataAdapter);

    }

3 个答案:

答案 0 :(得分:0)

将光标移动到第一行,在初始光标之后, Cursor.moveToFirst()

答案 1 :(得分:0)

您是否确定在插入值时正确填充了_id?如果使用模拟器,则可以提取数据库,并使用适用于Firefox的SQLiteManager插件打开它。同样,使用与我们的bindView()内部使用相同的投影列名称,而不是使用*进行全部查询。有些东西不符合这里

答案 2 :(得分:0)

这是由于冲突名称:_id可以同时引用到EXAMS和PROF。 SQLlite选择了EXAMS而不是PROF。

    mCursor = mDb.rawGet("SELECT *, "+
                    MySQLiteHelper.PROF_CONTACTS_TB_NAME+"."+MySQLiteHelper.PROF_CONTACTS_KEY_ID+" AS idProf "+
                    " FROM "+MySQLiteHelper.PROF_CONTACTS_TB_NAME+" LEFT JOIN "+
                    MySQLiteHelper.EXAMS_TB_NAME+" ON "+
                    MySQLiteHelper.PROF_CONTACTS_TB_NAME+"."+MySQLiteHelper.PROF_CONTACTS_KEY_COD_ESAME+"="+
                    MySQLiteHelper.EXAMS_TB_NAME+"."+MySQLiteHelper.EXAMS_KEY_COD +
                    " ORDER BY " + MySQLiteHelper.PROF_CONTACTS_TB_NAME+"."+MySQLiteHelper.PROF_CONTACTS_KEY_ID);

最后

    final Long id = c.getLong(c.getColumnIndexOrThrow("idProf"));   

这就成了伎俩。 应抛出碰撞名称错误,就像在SQL和MySQL中一样。