Android开发之读取数据库(SQLiteOpenHelper)

SQLite数据库

  • 相信大家都用过Excel吧,我们在管理一些比较复杂的数据时就会使用它。比如统计一个班的学生信息,我们一般会在第一行输入学生姓名、班级、学号等字段来构成一个学生的完整信息。例如:


    学生信息
  • 同样,我们在使用手机的时候也会产生大量数据要进行管理,比如在信息会话中,不同的联系人包含不同的短信内容以及对应的联系人。那我们如何管理这些数据呢?毫无疑问,通过数据库来管理。
  • SQLite数据库就是这样一个内置在Android中的轻量级的关系型数据库,它支持标准的SQL语法,并且只占用极少的内存。
  • 接下来我们将使用自己定义的MyDatabaseHelper类继承自SQLiteOpenHelper来实现我们的App。

读取数据库文件

  • 我们将完成一个拥有以下功能的App:
  1. 从一个已经写好的数据库(里面包含一些学生信息)读取学生的基本信息。
  2. 点击获取按钮,将读取出来的信息在ListView控件中展示。
  • 编写布局代码(代码最后给出),实现效果如下:


    主页面
  • 创建一个数据库辅助类,用于做数据库操作。代码如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {

    public MyDatabaseHelper (Context context, String name, int version) {
        super(context, name, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建sql语句,新建表
        String sqlCommand1 = "create table student(_id integer primary key, name varchar(255), age integer)";
        //执行sql语句
        db.execSQL(sqlCommand1);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
    }
}
补充
  1. MyDatabaseHelper是一个继承自SQLiteOpenHelper的Java类,它需要重写父类的onCreate()和onUpgrade()方法。该类的构造函数,也就是MyDatabaseHelper()用来初始化数据库连接。当数据表第一次被创建时,onCreate()方法将被触发,在该方法中实现数据表的创建。当数据库需要升级时,onUpgrade()方法将被触发,该方法实现数据库更新。
  • 在主活动onCreate()方法中,初始化ListView,创建数组适配器,并在按钮响应函数中编写数据库读取的代码。代码如下:
public class MainActivity extends AppCompatActivity {
    ArrayAdapter<String> adapter;
    private MyDatabaseHelper dbHelper;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button)findViewById(R.id.button1);
        //创建MyDatabaseHelper对象
        dbHelper = new MyDatabaseHelper(this, "test.db", 1);
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);
        ListView listView = (ListView)findViewById(R.id.list1);
        listView.setAdapter(adapter);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //通过SQLiteDatabase返回的对象对数据库进行操作
                //getWritableDatabase()方法创建或打开一个可读数据库
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //查询student表中所有数据
                //查询到的数据都将从Cursor对象取出
                Cursor cursor = db.query(false, "student", null, null, null ,null, null, null, null);
                if (cursor.moveToFirst()){//遍历对象
                    do {
                        //向适配器中添加数据
                        adapter.add(cursor.getString(cursor.getColumnIndex("name")));
                        adapter.add(cursor.getString(cursor.getColumnIndex("no")));
                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });
    }
}
补充
  • dbHelper = new MyDatabaseHelper(this, "test.db", 1)创建MyDatabaseHelper对象时需在其中传入Context(this)、数据库文件名字(test.db)、数据库版本(1)。这里我们已经传入一个写好的数据库文件,当系统发现已经有数据库了,就不会调用MyDatabaseHelper中的onCreate()函数,所以这两句代码就不会执行。
    String sqlCommand1 = "create table student(_id integer primary key, name varchar(255), age integer)";
    db.execSQL(sqlCommand1);
    写在这里是为了熟悉相关数据库操作方法。
  • 我们如何将数据库文件传入虚拟机中呢?需在Android Studio(3.2)打开Device File Explorer,上传test.db文件/data/data/com.example.datastoredemo/databases中。
  • SQLiteDatabase db = dbHelper.getWritableDatabase()getWritableDatabase()方法会创建或打开一个可读数据库。
  • Cursor cursor = db.query(false, "student", null, null, null ,null, null, null, null)Cursor类是数据每行的集合,db.query()方法中所含参数非常多(大家可以自行搜索一下),这里我们查询数据库中"student"表,并把查询到的数据返回给cursor便于后续操作。
  • cursor.moveToFirst()将记录指针移动到第一行,如有数据则执行下面的方法。
  • cursor.moveToNext()将记录指针移动到下一行,判断还有无数据。

实际效果

  • 添加数据前:


    添加数据前
  • 点击添加按钮:


    点击按钮

GitHub地址

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

推荐阅读更多精彩内容

  • 1 Android四种数据持久化方式 Android有四种数据持久化方式: SharePreference 轻量...
    Kevin_Junbaozi阅读 1,197评论 2 1
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,938评论 2 89
  • 开学前夕行匆匆,身处他乡人似梦。 深院迎宾凄清冷,唯有愚人独步行。 夜深银光照古松,伴我一行照路灯。 初春夜寒起冷...
    沐易丨手晨阅读 220评论 4 2
  • 周五我们上彩泥课,老师让我们准备一个圆形的底盘。让我们在上面涂上颜色。我想了想,该做什么呢?后来我想到上次...
    小痘痘胡阅读 163评论 0 0
  • 英雄 剑指九州笑天下,前斩群狼后弑虎! 豪情把酒为知音,一半琴音一半听! 欲斗苍穹浪天涯,左...
    余人未归阅读 245评论 2 8