我在使用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打开它):
这是输出:
随着数字越大(> 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);
}
答案 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中一样。