6

作者: JokerLiang | 来源:发表于2016-08-23 14:48 被阅读0次

结构

1:Android中数据库的创建
2:ListView的优化
3:数据库的分页查询以及ListView分页展示

1:Android中数据库的创建

1:写类继承SQLiteOpenHelper
    public class BlackNamedb extends SQLiteOpenHelper{


    public BlackNamedb(Context context) {
        super(context, "blackname.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //执行SQL语句
        sqLiteDatabase.execSQL("create table blackname" +
                "(_id integer primary key autoincrement,phone varchar(20),mode integer);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {

    }
}
2:重新写类私有化构造方法
3:申明一个静态的当前类对象
3:提供一个静态方法如果当前类的对象为空则要创建一个新的对象
    public class BlacknameJDBC {

    private final BlackNamedb blackNamedb;

    //1:私有化构造方法

    private BlacknameJDBC(Context context) {
        blackNamedb = new BlackNamedb(context);
    }
    //2:申明当前类的对象。必须是静态的
    private static BlacknameJDBC blacknameJDBC = null;
    //3:提供一个静态方法如果当前类的对象为空则要创建一个新的对象

    public static BlacknameJDBC getInstance(Context context){
        if (blacknameJDBC==null){
            blacknameJDBC = new BlacknameJDBC(context);
            return blacknameJDBC;
        }else {
            return blacknameJDBC;
        }
    }
4:提供增删改查等操作
     /**
     *
     * @param phone 拦截的电话
     * @param mode 拦截的类型 1是短信  2是电话  3是所有
     */
    public void insert(String phone , String mode){
        //开启数据库做写入操作

        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        //准备ContentValues 封装
        ContentValues values = new ContentValues();
        values.put("phone",phone);
        values.put("mode",mode);
        //进行写入操作 方法接收参数(表的名称,没有给值时,将null插入数据库,内容 ContentValues 用这个封装);
        writableDatabase.insert("blackname",null,values);

        blackNamedb.close();
    }

    /**
     *
     * @param phone  想要删除的电话号码
     */
    public void delect(String phone){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        //进行删除操作(表的名称,要删除的字段名称,要删除的字段值,要使用String类型的数组)
        writableDatabase.delete("blackname","phone=?",new String[]{phone});
        writableDatabase.close();
    }

    /**
     *  根据电话号码去更新拦截模式
     * @param phone 要更新的电话
     * @param mode 要更新为的模式(1:短信 2:电话    3:拦截所有(短信+电话)
     */
    public void updata(String phone,String mode){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        //准备数据
        ContentValues values = new ContentValues();
        values.put("mode",mode);
        //  ava.lang.String table, android.content.ContentValues values, java.lang.String whereClause, java.lang.String[] whereArgs
        //进行更新操作(表的名称,要更新的值,要更新的字段,依据什么字段更新)
        writableDatabase.update("blackname",values,"mode=?",new String[]{phone});
        writableDatabase.close();
    }

    /**
     * 返回的就是数据库中所有的号码以及类型
     */
    public List<Blacknamebin> FindAll(){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        //查询(表名,查询的字段,查询的条件,查询的条件,查询的条件,查询的条件,  查询出来排序的方法 默认为正序,desc为倒叙)
        //拿到游标
        Cursor query = writableDatabase.query("blackname", new String[]{"phone", "mode"}, null, null, null, null, "_id desc");
        //创建一个集合
        List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
        while (query.moveToNext()){
            //生成一个BIN类放常用字段
            Blacknamebin blacknamebin = new Blacknamebin();
            blacknamebin.phone = query.getString(0);
            blacknamebin.mode = query.getString(1);
            System.out.println("blacknamebin.phone"+query.getString(0)+"````````````blacknamebin.mode"+query.getString(1));
            blackname.add(blacknamebin);
        }
        query.close();
        writableDatabase.close();
        return blackname;
    }

    public List<Blacknamebin> FindOther(int index){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        Cursor query = writableDatabase.rawQuery("select phone,mode from blackname order by _id desc limit ?,10;", new String[]{index+""});
        List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
        while (query.moveToNext()){
            //生成一个BIN类放常用字段
            Blacknamebin blacknamebin = new Blacknamebin();
            blacknamebin.phone = query.getString(0);
            blacknamebin.mode = query.getString(1);
            System.out.println("blacknamebin.phone"+query.getString(0)+"````````````blacknamebin.mode"+query.getString(1));
            blackname.add(blacknamebin);
        }
        query.close();
        writableDatabase.close();
        return blackname;
    }

    public int getCount(){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        Cursor cursor = writableDatabase.rawQuery("select count(*) from blackname;", null);
        int count =0 ;
        if (cursor.moveToNext()){
            count = cursor.getInt(0);
        }
        cursor.close();
        writableDatabase.close();
        return count;
    }
}

2:ListView的优化

    listView优化
        1:复用convertView
        2:复用ViewHolder让其减少findViewById()次数
        3:static ViewHolder
        4:分页算法

模版代码
        ViewHolder  viewHolder = null;
    if(convertView == null){
        viewHolder = new ViewHolder();
        convertView = View.inflate();
        viewHolder.text1 = convertView.findViewById(R.id.text1);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder)convertView.getTag();
    }
    viewHolder.text1.setText("文本内容");


    static class ViewHolder{
        TextView text1;
    }

3:数据库的分页查询以及ListView分页展示

1:数据库查询指定数据写法
        public List<Blacknamebin> FindOther(int index){
        SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
        Cursor query = writableDatabase.rawQuery("select phone,mode from blackname order by _id desc limit ?,10;", new String[]{index+""});
        List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
        while (query.moveToNext()){
            //生成一个BIN类放常用字段
            Blacknamebin blacknamebin = new Blacknamebin();
            blacknamebin.phone = query.getString(0);
            blacknamebin.mode = query.getString(1);
            blackname.add(blacknamebin);
        }
        query.close();
        writableDatabase.close();
        return blackname;
    }
2:监听ListView的滚动事件重写里面的onScrollStateChanged方法
     lv_black_name.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
                //滚动过程中状态发生改变
                //SCROLL_STATE_IDLE  空闲状态
                //SCROLL_STATE_TOUCH_SCROLL 拿手触摸着滚动滚动状态
                // SCROLL_STATE_FLING 飞速滚动
              条件:
                //1:LV不能滚动
                //2:最后一个条目可见(最后一个条目的索引值大于数据适配器中条目值-1)
                //3:mIsload 这个是为了不重复加载
                if (blacknamebins != null) {
                    if (i == AbsListView.OnScrollListener.SCROLL_STATE_IDLE &&
                            lv_black_name.getLastVisiblePosition() >= blacknamebins.size() - 1 &&
                            !mIsload)
                    {
                        //mCount返回的是数据库中总条目的个数
                        if (mCount>blacknamebins.size()){
                            //开启线程加载数据
                            new Thread(){
                                @Override
                                public void run() {
                                    //获取数据库查询对象
                                    blacknameSelect = BlacknameJDBC.getInstance(Blackname_Activity.this);
                                    List<Blacknamebin> moreData = blacknameSelect.FindOther(blacknamebins.size());
                                    blacknamebins.addAll(moreData);
                                    mHandler.sendEmptyMessage(0);
                                    super.run();
                                }
                            }.start();
                        }
                    }
                }
            }
            @Override
            public void onScroll(AbsListView absListView, int i, int i2, int i3) {
                //滚动过程中调用的方法
            }
        });
3:通知数据适配器实时刷新调用API
                    if (mAdapter!=null){
                        mAdapter.notifyDataSetChanged();
                    }

相关文章

  • #知识体系精深营#六月+12次作业+第20组2小组+ynqj_a

    6-1 6-1 6-2 6-2 6-3 6-3 6-4 6-4 6-5 6-5 6-6 6-6 6-7 6-7 6...

  • 无标题文章

    1 2 2 3 5 6 6 6 6 6 6 8 3 6

  • 6+6=6

    【九洲芳文】 我不再记得安妮,这句话在一段时间内反复出现在我脑子里,侵蚀着我的神经,仿佛在强迫我遗忘记忆里某些很重...

  • 6/6

    今天又被骂了,会议又出错了,心情更糟了,即使有人开始分担工作,但是还是很晚下班。昨晚去运动,后来也没自己的份,这样...

  • 6/6

    口号(如:父母的高度就是孩子的起点)#孩子第二个30天目标:早睡加早起,培养清理整理书包学习桌面的能力 妈妈第二个...

  • 6/6

    通过这些年的实验,都证实了一点,自己所想的所要的都慢慢一点一点的实现了。所以,只要敢想,敢做,我们最终会成为自己想...

  • 6/6

    分解目标:个人月任务除以24。当天目标未完成,累计到第二天。 月度工作安排:第一周资源积累。第二周开单积累。第三周...

  • 6 6

    这是六月三日的的月亮

  • 6/6

    今天很难得的从构思开始写日记,写我自己真的想表达的事情 昨天晚上开小会说到了人际关系,现在公司的核心成员就我,大凯...

  • 【2018.10.16 】今日精进

    6:01-6:04赖床 6:04-6:12洗脚刷牙接水 6:12–6:32瑜伽 6:33-6:40洗脸 6:55–...

网友评论

      本文标题:6

      本文链接:https://www.haomeiwen.com/subject/ptqnsttx.html