Demo下载地址:http://download.csdn.net/detail/u011634756/5997835(免积分哦)
++++++++++++++++++++++++++++++++++++++++++++++++
一. Demo主要内容
1. SQLiteOpenHelper 和 数据库的增删改查
2. ListView 自定义显示数据库的内容(例如:给每一个item添加删除按钮)
注:Demo中有插入和删除按钮,长按是进行修改
二. Demo重点代码
1. SQLiteOpenHelper 的建立 和增删改查 和添加默认数据
首先 SQLiteOpenHelper 的建立创建一个类 来继承 SQLiteOpenHelper 它即可。
其次是数据库的增删改查实现,如下代码
-
-
-
-
-
- public long insertData(String data[]){
- ContentValues insertValues = new ContentValues();
- insertValues.put(KEY_NAME, data[0]);
- insertValues.put(KEY_SEX, data[1]);
- insertValues.put(KEY_ADDRESS,data[2]);
- return mSqLiteDatabase.insert(DB_TABLE, KEY_ID, insertValues) ;
- }
-
-
-
-
-
-
- public boolean deleteData(long _id){
- return mSqLiteDatabase.delete(DB_TABLE, KEY_ID + "=" + _id, null) > 0 ;
- }
-
-
-
-
-
-
-
- public boolean updateData( long _id ,String data[]){
- getWritableDatabase();
- ContentValues updataValues = new ContentValues();
- updataValues.put(KEY_NAME, data[0]);
- updataValues.put(KEY_SEX, data[1]);
- updataValues.put(KEY_ADDRESS,data[2]);
- return mSqLiteDatabase.update(DB_TABLE, updataValues, KEY_ID + " = " + _id, null)>0;
- }
-
-
-
-
-
- public Cursor fetchAllData(){
- return mSqLiteDatabase.query(DB_TABLE, null , null, null, null, null, null);
- }
-
-
-
-
-
-
- public Cursor fetchDataById(long _id){
- return mSqLiteDatabase.query(DB_TABLE, null ,KEY_ID + "=" + _id, null, null, null, null);
- }
最后是往数据库添加默认数据,在onCreate 里面 创建表后立马就进行insert操作。
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL(CREATE_DB);
-
- db.execSQL(TEST_INSERT);
- }
2. ListView 显示数据库的内容
在显示数据库的时候,Android已经封装好了一个SimpleCursorAdapter可以直接使用,但是如果要自定一个界面(例如在界面中添加一个 删除按钮)我们就需要继承于CursorAdapter来实现我们自定义的布局。
继承CursorAdapter 主要会实现一个构造方法和一个newView和bindView
- public SqlAdapter(Context context, Cursor c, int layout) {
- super(context, c );
- res_layout = layout;
- }
-
- @Override
- public void bindView(View view, Context context, Cursor c) {
- Log.v(TAG," Adapter , bindView");
- final Context _context = context;
- final Cursor cursor = c;
- final ViewHolder holder = (ViewHolder) view.getTag();
- holder.id.setText(cursor.getString(cursor.getColumnIndex(KEY_ID)));
- holder.name.setText(cursor.getString(cursor.getColumnIndex(KEY_NAME)));
- holder.sex.setText(cursor.getString(cursor.getColumnIndex(KEY_SEX)));
- holder.address.setText(cursor.getString(cursor.getColumnIndex(KEY_ADDRESS)));
-
- holder.removeButton.setOnClickListener(new Button.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- long id = Long.parseLong(holder.id.getText().toString());
-
- SQLDemoOpenHelper mHelper = new SQLDemoOpenHelper(_context);
- mHelper.open();
- mHelper.deleteData(id);
- Cursor newCursor = mHelper.fetchAllData();
- changeCursor(newCursor);
- notifyDataSetChanged();
- mHelper.close();
-
- }
- });
- }
-
-
-
-
-
-
- @Override
- public View newView(Context context, Cursor c, ViewGroup arg2) {
- Log.i(TAG," Adapter , newView");
- View view = View.inflate(context, res_layout, null);
- ViewHolder holder = new ViewHolder();
- holder.name = (TextView) view.findViewById(R.id.tv_item_name);
- holder.sex = (TextView) view.findViewById(R.id.tv_item_sex);
- holder.address = (TextView) view.findViewById(R.id.tv_item_address);
- holder.removeButton = (Button) view.findViewById(R.id.bu_remove);
- holder.id = new TextView(context);
- holder.id.setVisibility(View.INVISIBLE);
- view.setTag(holder);
- return view;
- }
-
-
-
-
-
-
-
- final static class ViewHolder {
- public TextView id;
- public TextView name;
- public TextView sex;
- public TextView address;
- public Button removeButton;
-
- }
下面我们说一下 实现那个删除按钮
在bindView里面的Cursor是每一个Item的Cursor所以我们可以获取当前Cursor的Id来删除,想法是好的但是现实是残酷的,问题来了,删除的时候不是删除的当前id而是别的Id ,通过观察发现获取的id是最后一次调用bindView的那个id,也就是说 这种方法是不可取的。
那么我继续来观察一下,id获取这个是有问题的那么,我们现在的内容怎么没有混乱呀,这个我们可以利用这个东西进行白标记,即:使用建立一个隐藏的TextView来记录每一个Item的_id 然后在删除的时候获取这个id,立马行动发现真的可行哦
xx 代码上面已经贴出来了。。。。
三.效果图
====================关注小鱼===================
新浪微博:http://weibo.com/AwareMissing
腾讯微博:http://t.qq.com/y_haiyang