加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 19:31:19 所属栏目:百科 来源:网络整理
导读:运行效果如下 我们一步一步来实现 之前我们是完成了布局和sqlite建库和基本的工具类现在我们来开始写业务逻辑 来写一个MainActivity public class MainActivity extends Activity { private ListView mBookListView; private EditText edtname; private Edit

运行效果如下 我们一步一步来实现
之前我们是完成了布局和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()方法时会覆盖。这里暂且就不研究了,遇到了再说。。。看到这里,自己编一遍跑一下吧!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读