Sqlite的使用和一个简单的书籍管理系统(下)

来源:互联网 发布:蒙特卡洛算法 matlab 编辑:程序博客网 时间:2024/05/16 05:53

运行效果如下 我们一步一步来实现有点手抽、、
之前我们是完成了布局和sqlite建库和基本的工具类现在我们来开始写业务逻辑
来写一个MainActivity

public class MainActivity extends Activity {    private ListView mBookListView;    private EditText edtname;    private EditText edtprice;    private SimpleCursorAdapter simpleCursorAdapter;    private Cursor cursor;    private Context context;//因为要经常使用上下文 所以新建一个context    @SuppressWarnings("deprecation")    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.book_item);        context = this;        edtname = (EditText) findViewById(R.id.name_et);        edtprice = (EditText) findViewById(R.id.price_et);        mBookListView = (ListView) findViewById(android.R.id.list);        // ListView要展示批量结构化的数据1.列表项 2.初始数据 3.适配器4.监听        // 2初始数据        cursor = new DButils(this).findcursor();        // 3.游标适配器 将数据库里面的文字和数据传给控件显示出来        simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.activity_main, cursor,                new String[] { DButils.ID, DButils.NAME, DButils.PRICE, DButils.ID },                new int[] { R.id.id_tv, R.id.name_tv, R.id.price_tv, R.id.delete_tv });        // FLAG_REGISTER_CONTENT_OBSERVER :注册内容观察        mBookListView.setAdapter(simpleCursorAdapter);        // 4长按监听        mBookListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {            @Override            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {                DButils dbUtils = new DButils(context);                cursor.moveToPosition(position);                int id1 = cursor.getInt(cursor.getColumnIndex("_id"));                Toast.makeText(getApplicationContext(), "通过位置取得的" + id + "通过游标取得" + id1, Toast.LENGTH_SHORT).show();                dbUtils.delete((int) id);                //刷新操作!!!!增删都要用到                cursor.requery();                // 假如查询数据库,建议开启子线程                simpleCursorAdapter.notifyDataSetChanged();                // 发一个通知刷新,关联的listview刷新                return false;            }        });    }    // 添加记录    public void add(View v) {        DButils dButils = new DButils(context);        String name=edtname.getText().toString().trim();        String price=edtprice.getText().toString().trim();        ContentValues values=new ContentValues();        values.put(dButils.NAME, name);        values.put(dButils.PRICE, price);        dButils.save(values);        cursor.requery();        // 假如查询数据库,建议开启子线程        simpleCursorAdapter.notifyDataSetChanged();        // 发一个通知刷新,关联的listview刷新        edtname.setText("");        edtprice.setText("");    }    // 删除记录    public void delete(View v) {        TextView textView = (TextView) v;        String string = textView.getText().toString();        DButils dButils = new DButils(context);        dButils.delete(Integer.valueOf(string));        cursor.requery();        // 假如查询数据库,建议开启子线程        simpleCursorAdapter.notifyDataSetChanged();        // 发一个通知刷新,关联的listview刷新    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        System.out.println("ondestory");        if (cursor != null) {            cursor.close();        }        super.onDestroy();    }}

逻辑很清楚,注释我也写的很明白了。就有个点要注意一下
SimpleCursorAdapter适配器是继承了CursorAdapter
继承关系如下

CursorAdapter 继承了 BaseAdapter
好处:仅加载需要显示的数据,性能好

使用方法:
1.实现两个参数构造方法
2.重写newView()方法
layout->view
3.重写bindView()方法
view.set

数据更新:
adapter.changeCursor(cursor);
adapter.notifyDataSetChanged();
我们上面的例子是使用

    cursor.requery();        // 假如查询数据库,建议开启子线程        simpleCursorAdapter.notifyDataSetChanged();        // 发一个通知刷新,关联的listview刷新

来更新simpleCursorAdapter,并且传递给listview
代码如下:

public void createCursorAdapter(Cursor cursor)    { //游标适配器,构造方法,传入cursor        mAdapter = new CursorAdapter(this, cursor)        {//重写两个方法            @Override            public View newView(Context context, Cursor cursor, ViewGroup parent)            {//找到布局和控件                ViewHolder holder = new ViewHolder();                LayoutInflater inflater = getLayoutInflater();                View inflate = inflater.inflate(R.layout.listview_item, null);                holder.item_tv_name = (TextView) inflate.findViewById(R.id.item_tv_name);                holder.item_tv_phone = (TextView) inflate.findViewById(R.id.item_tv_phone);                inflate.setTag(holder);                return inflate;//返回的view传给bindView。            }            @Override            public void bindView(View view, Context context, Cursor cursor)            {//复用布局。//                把数据设置到界面上                ViewHolder holder = (ViewHolder) view.getTag();                String name = cursor.getString(cursor.getColumnIndex("name"));                String phone = cursor.getString(cursor.getColumnIndex("phone"));                holder.item_tv_name.setText(name);                holder.item_tv_phone.setText(phone);            }        };    };

再有就是那个删除标志的用法哪里要注意,把字体设置为透明。Textview的点击事件clickable设置为true。点击传text里面的id。
那个id有时候自己重写geTItemId()方法时会覆盖。这里暂且就不研究了,遇到了再说。。。看到这里,自己编一遍跑一下吧!

0 0
原创粉丝点击