相比于MySql等数据库,SqLite有它自己的工具Cursor,一次获取一行数据(在数据库中,一行包含了一个主键约束的索引的全部内容)。
使用游标来读数据库一般分两步:(就像在游标卡尺上读数)
1.横向的获取列名所对应的位置(储存在Cursor中的位置),getColumnIndex方法
2.通过得到的位置,getString(index) or getInt(index)
3.也可以做循环输出
while (cursor.moveNex()t){
//move方法 返回一个布尔值,当到达最后一行时,返回false
}
下面结合的例子Cursor与RecyclerLayout的结合使用,大部分代码无难度,主要是对RecyclerView的适配器不熟悉,造成加载数据的部分花了很多coding时间。
首先是cursor中数据的读取
protected void bind(int position){
if(!cursor.moveToPosition(position))
return;
//若选中位置没有数据,返回,其实还是一个安全保护,防止程序意外崩溃
int index;
index=cursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_GUEST_NAME);
String guestName=cursor.getString(index);
index=cursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_TIMESTAMP);
String time=cursor.getString(index);
nameTextView.setText(time);
partySizeTextView.setText(guestName);
}
其中妙处在于,RecyclerView适配器的position刚好和cursor中的moveToPosition完美的结合起来了,不得不赞叹Google工程师的智慧。
@Override
public GuestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//获取填充器
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.guest_list_item, parent, false);
return new GuestViewHolder(view);
}
@Override
public void onBindViewHolder(GuestViewHolder holder, int position) {
//holder是ViewHolder实例
holder.bind(position);
}
@Override
public int getItemCount() {
return cursor.getCount();
}