6

结构

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();
                    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容