实践总结
Whattodo项目,一个关于时间管理的小项目,为老婆大人写的,当做练手。
version 1.0,具体任务,建立数据库sqlite实现。UI见面暂时就是一个简单的listview,每一item是一个标题加单选框。目标实现简单的插入,修改,和删除。还有就是对任务的排序,实现方式是list的下拉刷新。
总结下之前遇到的问题:
1.从sqlite读取单行内容,返回一个cursor,这时候sqlite的处理和别的之前接触的数据库有些不同。不同体现在cursor.movetofirst(),这个方法上。简单解释下就是,执行拉一个query之后返回一个cursor,如果这个cursor不为null,那么这个cursor的getposition方法讲返回一个整数。需要注意的是,其值为-1,也就是说,我们不做任何处理想直接把这个cursor拿出来用,大家会发现很奇怪的错误,大体就是positon是-1这个错误。
code:
public Cursor fetchMission(long rowId)
{
Cursor mCursor = mDb.query(true,DATABASE_TABLE_MISSION, new String[]{KEY_ROWID,KEY_TITLE,KEY_BODY,KEY_PRIORITY,KEY_STATUS}, KEY_ROWID + "=" +rowId,null, null, null,null,null);
if(mCursor != null)
mCursor.moveToFirst();
return mCursor;
}
我们调用了这个方法后,我们可以直接使用例如:
Cursor mission = mDbHelper.fetchMission(mRowId);
mTitleText.setText(mission.getString(mission.getColumnIndex(ItemToDoDBAdapter.KEY_TITLE)));
上面是正确的,但是,如果我们把方法中的 mCursor.movetofirst()方法去了。
上述调用将会报错。
对比之下,大家应该就可以看出来差异了。sqllite里面的查询命令返回的cursor的默认游标位置是第一组数据的前一个位置,就是-1。
所以大家在从cursor再获取数据的时候,要斟酌下是使用do..while(mCursor.moveToNext()),还是while((mCursor.moveToNext()){}
2.spinner中根据value还获取position的处理。

浙公网安备 33010602011771号