android读取sqlite数据库的数据并用listview显示

android读取sqlite数据库的数据并用listview显示android读取sqlite数据库的数据并用listview显示刚刚接触android,老师给了我了几个班级信息的excel,让我做一个考勤的系统出来,本篇仅记录了真机调试下,读取已有静态数据库信息并显示在listview中。准备工作开发工具为AndroidStudio。sqlite可视化软件SQLiteExpertProfessional5已将excel表转化为的数据库student1………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

统一回复一个问题,有些小伙伴私信问我如何更换数据库进行读取,本篇仅限于读取静态的数据库文件,如果是读取静态数据库文件只需要替换掉文件并对代码里的数据库字段进行修改就可以了。因为当时是读本科的时候写的,那个时候懂得并不是很多,想通过接口调用方式读取数据库就不用看啦~

———————————————-以下写于2018年———————————————–

android读取sqlite数据库的数据并用listview显示

刚刚接触android,老师给了我了几个班级信息的excel,让我做一个考勤的系统出来,本篇仅记录了真机调试下,读取已有静态数据库并显示在listview中。

准备工作

  • 开发工具为Android Studio。
  • sqlite可视化软件SQLite Expert Professional 5 
  • 已将excel表转化为的数据库 student1.db。
  • 在AS中创建assets文件夹并将db文件拷贝进去。
  • 创建实体类Student。

数据库如图

android读取sqlite数据库的数据并用listview显示

要点

  • 读取assets文件夹下已有的数据库文件

在android开发时,很多时候我们会使用可视化界面创建数据库,或者拿到别人的数据库使用,这时就需要我们将db文件手动加入到assets文件是夹中并读取。但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的。

解决方法很简单,只需要把assets目录下的db文件复制一份到SDCard中的”/data/data/” + packName + “/”目录下就可以了。代码如下参考Android开发系列(十七):读取assets目录下的数据库文件_u010800530的博客-CSDN博客

public class SQLdm {
    //数据库存储路径
    String filePath = "data/data/kaoqin.xxf.com.kaoqin/student1.db";
    //数据库存放的文件夹 data/data/kaoqin.xxf.com.kaoqin 下面
    String pathStr = "data/data/kaoqin.xxf.com.kaoqin";

    SQLiteDatabase database;
    public  SQLiteDatabase openDatabase(Context context){
        System.out.println("filePath:"+filePath);
        File jhPath=new File(filePath);
        //查看数据库文件是否存在
        if(jhPath.exists()){
            Log.i("test", "存在数据库");
            //存在则直接返回打开的数据库
            return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
        }else{
            //不存在先创建文件夹
            File path=new File(pathStr);
            Log.i("test", "pathStr="+path);
            if (path.mkdir()){
                Log.i("test", "创建成功");
            }else{
                Log.i("test", "创建失败");
            };
            try {
                //得到资源
                AssetManager am= context.getAssets();
                //得到数据库的输入流
                InputStream is=am.open("student1.db");
                Log.i("test", is+"");
                //用输出流写到SDcard上面
                FileOutputStream fos=new FileOutputStream(jhPath);
                Log.i("test", "fos="+fos);
                Log.i("test", "jhPath="+jhPath);
                //创建byte数组  用于1KB写一次
                byte[] buffer=new byte[1024];
                int count = 0;
                while((count = is.read(buffer))>0){
                    Log.i("test", "得到");
                    fos.write(buffer,0,count);
                }
                //最后关闭就可以了
                fos.flush();
                fos.close();
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
            //如果没有这个数据库  我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了
            return openDatabase(context);
        }
    }
}

  • 将数据显示到ListView中

此时问题来了,一个班有60个人,读取到ListView中针对每一个Item都要要求adapter”给我一个视图”(getView),如果一个班有上亿的人要为每一个Item都新建一个视图显然是不可能的。

实际上Android为你缓存了视图,Android中有个叫做Recycler的构件,下图是他的工作原理

android读取sqlite数据库的数据并用listview显示

  1. 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
  2. ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
  3. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。(关于getView原理参考 http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html )

在此是对ListView性能进行了优化,很大程度减小了对内存的损耗。 

代码如下

public class MainActivity extends AppCompatActivity {

    
    private ListView lv;
    private ArrayList<Student> studentlist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        studentlist = new ArrayList<>();
        SQLdm s = new SQLdm();
        SQLiteDatabase db = s.openDatabase(getApplicationContext());
        Cursor cursor = db.rawQuery("select * from yidong",null);
        while(cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String xuehao = cursor.getString(cursor.getColumnIndex("xuehao"));
            String Class = cursor.getString(cursor.getColumnIndex("Class"));
            Student st = new Student(name,Class,xuehao);
            studentlist.add(st);
        }
        lv = (ListView)findViewById(R.id.student_lv);
        lv.setAdapter(new BaseAdapter() {
            /*
             * 为ListView设置一个适配器
             * getCount()返回数据个数
             * getView()为每一行设置一个条目
             * */
            @Override
            public int getCount() {
                return studentlist.size();
            }

            @Override
            public Object getItem(int position) {
               // return studentlist.get(position);
                return null;
            }

            @Override
            public long getItemId(int position) {

               // return position;
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {


                View view ;
                /**对ListView的优化,convertView为空时,创建一个新视图;
                 * convertView不为空时,代表它是滚出,
                 * 放入Recycler中的视图,若需要用到其他layout,
                 * 则用inflate(),同一视图,用fiindViewBy()
                 * **/
                if(convertView == null )
                {
                    LayoutInflater inflater = MainActivity.this.getLayoutInflater();
                    view = inflater.inflate(R.layout.item,null);
                   //view = View.inflate(getBaseContext(),R.layout.item,null);
                }
                else
                {
                     view = convertView;
                }
                //从studentlist中取出一行数据,position相当于数组下标,可以实现逐行取数据
                Student st = studentlist.get(position);
                //TextView name = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null).findViewById(R.id.stu_name);
                //TextView xuehao = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null).findViewById(R.id.stu_number);
                //TextView Class = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null).findViewById(R.id.stu_age);
                TextView name = (TextView)view.findViewById(R.id.stu_name);
                TextView xuehao  = (TextView)view.findViewById(R.id.stu_number);
                TextView Class = (TextView)view.findViewById(R.id.stu_age);

                xuehao.setText(st.getXuehao());
                name.setText(st.getName());
                Class.setText(st.getclass());

                return view;
            }
        });
    }
}

运行结果如图

android读取sqlite数据库的数据并用listview显示

布局很简单,代码图就不贴了,到此就结束了, 整个系统的后续会陆续记载在笔记中。

完整DEMO下载地址:  点此下载demo

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158245.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java从入门到精通学习路线

    java从入门到精通学习路线目前 Java 在许多行业的客户端方面的应用非常多 比如 OA 邮箱 投票 金融 考试 物流 医疗 矿山等信息方面的系统 Java 开发者在这方面的需求也非常大 待遇也相当不错 工资水平可能和 Java 互联网方向的差不多 但福利和前途则非常好 因为这类工作基本上是政府事业单位及大型企业提供的 对于 java 学习 一套专业系统的 java 学习路线图是不可少的 让你从入门到精通实现系统化 nbsp 第一阶段

    2025年9月28日
    3
  • 哪些不符合python语言变量名_以下选项中不符合 Python 语言变量命名规则的是( )_学小易找答案…[通俗易懂]

    哪些不符合python语言变量名_以下选项中不符合 Python 语言变量命名规则的是( )_学小易找答案…[通俗易懂]【单选题】下列各项中,关于银行存款业务的表述中正确的是()。(2012年)【单选题】下列各项中,关于企业无法查明原因的现金溢余,经批准后应贷记的会计科目是()。【多选题】计价软件中,在人材机汇总界面广材助手中,可以进行的调价有()【单选题】1KB表示()。【多选题】在分部分项工程界面,添加一项清单的方法有()【多选题】在计价软件中新建三级项目管理后,可以进行的造价分析有()【判断题…

    2022年5月29日
    45
  • vs2012安装教程_vs2005安装图解

    vs2012安装教程_vs2005安装图解Microsoft 的安装包怎么会这样呢?昨天做VS2005 Web项目时,不能加载项目,显示无效还是不支持的安装包,网上搜一下,发现是没有打补丁,急忙在微软网站下载VS2005SP1 补丁,下载家里速度是可以,不到半个小完成.当从22:22分开始安装,装到00:35,整整2个多小时,真是郁闷,怎么是这样的安装包呢,完成了倒是可以打开项目了,不提示上面提到的错误!

    2022年10月6日
    3
  • 能直接下载到u盘的电影网站_DvD光盘

    能直接下载到u盘的电影网站_DvD光盘低调地来发个小东东,现在的verycd,没有铜2就不能下载了,下载的链接都是被隐藏掉了(该内容尚未提供权利证明,无法提供下载。)不用铜光盘就能下载的方法?还在为没铜光盘或者没时间刷铜盘的朋友需要可以试试这个之前做的东东,现在共享出来(当然了,如果你看到了这篇文章的话)做得可能有些粗简,但还能用,不打算再优化了,至于浏览器扩展什么的也不打算写了,需要就凑合着用吧百度网…

    2022年8月10日
    7
  • 02Windows日志分析[通俗易懂]

    02Windows日志分析[通俗易懂]计算机系统日志作用系统日志是记录系统中硬件、软件中的系统问题信息,同时还可以监视系统中发生的事件用户可以通过日志来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹Windows日志分类Windows系统日志(包括应用程序、安全、安装程序和转发的事件)服务器角色日志应用程序日志服务日志事件日志基本信息该日志主要记录行为当前的日期、时间、用户、计算机、信息来源、事件、类型、分类等信息事件类型及描述事件类型错误出现问题可能会影响触发事件的应用程序或组件外部

    2025年10月1日
    2
  • Oracle 判断 并 手动收集 统计信息 脚本

    Oracle 判断 并 手动收集 统计信息 脚本

    2021年9月17日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号