Android数据库使用指南(上)

前言
Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了。

关于如何使用SQLite,老实说,都在android.database.sqlite这个包里面。
这里首先先提一下,Android中的SQLite,支持的存储的数据类型一共有9种:

1 Byte
2 Long
3 Short
4 Integer
5 Float
6 Double
7 String
8 Boolean
9 byte[]

相信这些数据已经完全满足你的日常需求了吧,因为支持保存byte[]所以,几乎支持保存任何东西了吧,因为任何东西都能转化为byte[]啊。

SQLiteOpenHelper
既然是数据库的增删改查,我们首先需要一个数据库,数据库怎么生成呢,数据库要通过SQLiteOpenHelper的子类生成,所以我们需要建一个类来继承SQLiteOpenHelper。由于这个类是一个抽象类,我们需要实现他的构造方法和抽象方法。所以:

public class DBHelper extends SQLiteOpenHelper {

    // 数据库默认名字
    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

这里存在2个抽象方法,onCreate和onUpgrade。
onCreate:创建表啊啥的,可以在这里面写。
onUpgrade:数据库需要更新的时候使用,前提是已经存在了一个相同的数据库,需要新加表,或者原来的表字段要修改啥的,就在这里面写。

现在我们创建一个名为table1的表:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 (" +
                " _byte byte," +
                " _long long," +
                " _text text," +
                " _short short," +
                " _int int," +
                " _float float," +
                " _double double," +
                " _boolean boolean," +
                " _blob blob" +
                ")");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

创建表其实就是利用SQLiteDatabase对象的execSQL方法执行sql语句。

接下来我们做一些简单的增删改查,为了便于管理,我们将增删改查写在另一个类中好了。

增删改查
我们新建一个DBManger类作为增删改查管理类好了,该类就定义为一个单例,作为专门管理这个test.db数据库的工具好了。

public class DBManger {

    private Context context;
    private static DBManger instance;
    // 操作表的对象,进行增删改查
    private SQLiteDatabase writableDatabase;

    private DBManger(Context context) {
        this.context = context;
        DBHelper dbHelper = new DBHelper(context, 1);
        writableDatabase = dbHelper.getWritableDatabase();
    }

    public static DBManger getInstance(Context context) {
        if (instance == null) {
            synchronized (DBManger.class) {
                if (instance == null) {
                    instance = new DBManger(context);
                }
            }
        }
        return instance;
    }

}

我们通过DBHelpergetWritableDatabase方法得到SQLiteDatabase对象,SQLiteDatabase可以对数据库表进行操作,比如我们要新增数据:

public void add() {

        ContentValues contentValues = new ContentValues();

        byte _byte = Byte.MAX_VALUE;
        contentValues.put("_byte", _byte);

        long _long = Long.MAX_VALUE;
        contentValues.put("_long", _long);

        String _text = "字符串";
        contentValues.put("_text", _text);

        short _short = Short.MAX_VALUE;
        contentValues.put("_short", _short);

        int _int = Integer.MAX_VALUE;
        contentValues.put("_int", _int);

        float _float = Float.MAX_VALUE;
        contentValues.put("_float", _float);

        double _double = Double.MAX_VALUE;
        contentValues.put("_double", _double);

        boolean _boolean = true;
        contentValues.put("_boolean", _boolean);

        byte[] _byteArr = {Byte.MIN_VALUE, Byte.MAX_VALUE};
        contentValues.put("_blob", _byteArr);

        writableDatabase.insert("table1", null, contentValues);

    }

其实主要就是用到了SQLiteDatabase的insert方法,传入表名,null,和contentValues。
第一个参数:表名
其中第二个参数大概说一下,老实说,目前为止,第2个参数的意义就我个人而言,我觉得意义不大,因为只有当我们没有向表中写入任何数据的时候,这个才会出效果,所以直接写null就行了,因为我们调用这个方法的目的就是为了写数据啊。
第三个参数:Android提供了一个ContentValues,有点类似map集合的方式,可以理解成一个包裹,将数据打包成一个包裹,然后将这个包裹丢进去。put的第一个参数是列名,第二个是值。


那么如何删除数据呢:

public void del() {
        writableDatabase.delete("table1", "_int = ?", new String[]{Integer.MAX_VALUE + ""});
}

使用delete方法
参数1:表名
参数2:删数据的条件
参数3:对应参数2中的问号”?”
比如这里就是删除_int = Integer.MAX_VALUE的值,好像所有数据都删除完了哈。。。

这里都条件筛选很灵活,不仅仅可以是 XX = ?,还可以是XX > ?,XX < ?,甚至是XX > ? and YY = ?,不过这样,第三个参数里面,就需要2个值了。


如果了解了增和删的方法,那么理解修改的方法就会变得很容易。

public void update() {
        ContentValues contentValues = new ContentValues();
        contentValues.put("_text", "修改后的字符串");
        writableDatabase.update("table1", contentValues, "_text = ?", new String[]{"字符串"});
 }

调用update方法,参数依次:表名、包裹、条件、条件的值 
不用细说了吧?修改满足某些条件的数据

增删改我们都看了,我们现在来看看稍微有点复杂的查询。

    public String select() {

        Cursor cursor = writableDatabase.query("table1", null, null, null, null, null, null, null);

        int position = cursor.getPosition();
        Log.e(TAG, "select: 游标默认位置:" + position);

        String result = "";

        while (cursor.moveToNext()) {

            byte _byte = (byte) cursor.getShort(cursor.getColumnIndex("_byte"));
            long _long = cursor.getLong(cursor.getColumnIndex("_long"));
            String _text = cursor.getString(cursor.getColumnIndex("_text"));
            short _short = cursor.getShort(cursor.getColumnIndex("_short"));
            int _int = cursor.getInt(cursor.getColumnIndex("_int"));
            float _float = cursor.getFloat(cursor.getColumnIndex("_float"));
            double _double = cursor.getDouble(cursor.getColumnIndex("_double"));
            boolean _boolean = cursor.getInt(cursor.getColumnIndex("_boolean")) == 1 ? true : false;
            byte[] _byteArr = cursor.getBlob(cursor.getColumnIndex("_blob"));

            result += String.format("_byte = %s, _long = %s, _text = %s, _short = %s, _int = %s, _float = %s, _double = %s, _boolean = %s, _byteArr = %s",
                    _byte, _long, _text, _short, _int, _float, _double, _boolean, _byteArr) + "\n";

        }

        return result;

    }

是不是有种突然变复杂的感觉,老实说我们一点一点的看,其实是没有问题的,这里我们调用了query方法,参数真是多的不得了啊,不过我们只传了一个参数,就是表名这个参数,也就是第一个,那么其他参数是干嘛的呢,由于这是个查询方法嘛,所以其他参数当然是跟查询有关的啦,比如查询条件,排序什么的,这么我们下面慢慢说。

首先query方法返回了一个Cursor对象,这个对象是干嘛的呢,中文翻译“光标“,也就是我们在打字的时候,那个一闪一闪的竖线,我们也叫他游标。这个东西是定位用的,数据库中的表大概长这个样子:

游标默认指定-1的位置,也就是没有数据,当我们调用cursor.moveToNext()的时候,游标就会指向下一个位置,如果是以上图为例,那就是指向第一个位置,然后这里的while循环就会遍历完所有的数据了。
我们可以获取到cursor指定的位置的数据,获取方式如上代码,这里挑一个例子说一下,其他相似:

byte _byte = (byte) cursor.getShort(cursor.getColumnIndex("_byte"));

首先说明一下,cursor没有getByte的方法,所以用getShort接收下。。。

比如这个,cursor.getShort()是得到short类型的数据,里面传的参数其实是int类型的数据,代表第几个字段,也就是那一列的数据,如cursor.getShort(4),因为cursor本身就代表某个具体的一行了,所以这里就是,第已知行的第4列数据。至于这个方法参数本来应该传一个int,为什么传的是cursor.getColumnIndex("_byte"),这个方法,其实就是告诉你列名为“_byte“的字段是第几行,然后就可以得到数据啦!

这里我们讲一下query的参数,8个参数:

1 String table
2 String[] columns
3 String selection
4 String[] selectionArgs
5 String groupBy
6 String having
7 String orderBy
8 String limit

table:表名

columns:需要被查询的列名,比如说,可以这样传:new String[]{"_byte", "_long"},那么查询的结果就只有两列了,如:

selection和selectionArgs就一起说了,这两个就是条件查询,跟前面的修改表的条件同理,举个例子可以这样传:
"_byte = ?", new String[]{"127"}

groupBy:将相同值划分为一组。举个例子,假设有个水果表

然后使用groupBy以后:

有没有发现,本来重复的苹果,使用groupby以后,没有了,groupby就是去掉重复的内容,是不是跟set集合相似。

别感觉这玩意儿没啥用啊,举个例子,你在一张表里记录了无数用户的无数操作,这时候使用groupby,你就可以很方便的查到某一个人做了哪些操作了,是不是很方便,或者查询到哪些人做了某个操作。在学到groupby之前,你是不是想着每个用户的操作都建一个表记录下来,不要害臊,最开始我也是这样打算的,哈哈!

having:这个也是个条件判断的参数,不过这个要跟groupby这个参数同时存在,也就是要同时使用。也就是说,在groupby筛选后的数据中,再使用这个所谓的having再筛选一次。传递格式可以这样:字段 > 20
举个例子吧,比如我们有这样一张表:

然后配合groupBy使用having后

有人就提出问题了,第2个数据的苹果不也大于20吗,为什么没有这个数据,因为第2个数据不大于20,groupBy代表分组,苹果现在就是以一个组为单位行动,这时候不能呈个人英雄,这样理解没毛病!

orderBy:代表排序,可以传某个字段,比如_byte,这就代表按照这个字段排序,默认是升序,也就是从小到大排序,我们可以这样传递参数,让其降序排列_byte desc,如果是_byte asc就是升序,由于默认升序,所以这个asc也就省略了。

limit:代表只查多少条数据,比如只查10条数据,就直接传递一个10就行了。

结语
本文主要讲解内容:

如何创建数据库
如何创建表
对表的增删改查
其实主要还是讲解了对表中数据的修改。
关于查询数据,讲的很详细,主要是query这个方法的参数实在是太多了,像我平时基本就只用传一个参数,其他全部为null,哈哈。

下一章节我们会讲解对数据库中的表的修改,以及如何升级数据库之类的,拭目以待吧!
---------------------
版权声明:本文为CSDN博主「你缺少想象力」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IT_XF/article/details/82591770

原文地址:https://www.cnblogs.com/Im-Victor/p/11332425.html

时间: 2024-11-11 10:53:30

Android数据库使用指南(上)的相关文章

英特尔 Android* 开发人员指南上的对等应用

简介 当没有 Wi-Fi 访问点或互联网访问时,Android* 应用可能需要对等连接在两台或多台 Android* 设备之间建立连接. 比如,文件共享应用和多人游戏. 该功能可使用 NFC.蓝牙或 Wi-Fi 对等技术来实施. 特定案例中的首选技术需要根据所需的距离.连接速度.功耗和独特的技术特性来决定. 本文将对 Wi-Fi 对等技术进行评估. Wi-Fi 对等(P2P)支持具备适当应用的 Android 4.0 或更高版本在没有接入点的情况下通过 Wi-Fi 彼此连接. Android W

Android研究之英特尔 Android* 开发人员指南上的对等应用详解

简介 当没有 Wi-Fi 访问点或互联网访问时,Android* 应用可能需要对等连接在两台或多台 Android* 设备之间建立连接. 比如,文件共享应用和多人游戏. 该功能可使用 NFC.蓝牙或 Wi-Fi 对等技术来实施. 特定案例中的首选技术需要根据所需的距离.连接速度.功耗和独特的技术特性来决定. 本文将对 Wi-Fi 对等技术进行评估. Wi-Fi 对等(P2P)支持具备适当应用的 Android 4.0 或更高版本在没有接入点的情况下通过 Wi-Fi 彼此连接. Android W

Android数据库使用指南(下)

前言 上面已经说了,对表进行修改,其实就是对数据库进行升级,删除表也算升级啊,反正就是发生变化,数据库就需要升级. 所以老实说其实有个地方决定了数据库的版本 public class DBHelper extends SQLiteOpenHelper { public static final String db_name = "test.db"; public DBHelper(Context context, int version) { super(context, db_nam

Android数据库信息显示在listview上

Key Points: 1.使用SimpleCursorAdapter将Android数据库信息显示在listview上 adapter = new SimpleCursorAdapter(this, R.layout.user_list_cell, null, new String[]{"name","sex"}, new int[]{R.id.tvName, R.id.tvSex}); 2.长按listview弹出对话框删除信息.顺带学习了AlertDialog

Android数据库之基本概念(上)

1.Android数据库简介 Android通过结合使用SQLite数据库和Content Provider,提供了结构化数据的持久功能. SQLite数据库可以通过一种结构化的.易于管理的方法来存储应用程序数据.Android提供了一个完整的SQLite关系数据库的库文件.每个应用程序都可以创建自己的数据库,并对这个数据库拥有完全的控制权. Android数据库存储在设备上的/data/data/<package name>/database文件夹中,所有的数据库都是私有的,只能被创建他们的

Android SDK上手指南 2:用户界面设计

http://mobile.51cto.com/ahot-419184.htm 内容简介 我们将为应用程序项目添加布局方案,在这方面XML与Eclipse ADT接口将成为工作中的得力助手--不过在后面两节中还会用到一部分Java开发知识.XML与Java在Android平台的开发工作当中可谓无处不在,如果大家对二者还缺乏基本的了解,请尽快想办法补补课.对于刚刚入门的读者朋友来说,本文所介绍的要点将成为各位日后开发工作的重要基础. 1. XML基础知识 在我们开始讨论布局之前,先来梳理作为标记语

最全面的 Android 编码规范指南

最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文档中,除非另有说明: 术语 class 可表示一个普通类,枚举类,接口或是annotation类型(@interface) 术语 comment 只用来指代实现的注释(im

《Android编程权威指南》-读书笔记(三)Git初探

<Android编程权威指南>-读书笔记(三)Git初探 版本控制-Git 为什么要使用版本控制 什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制. 如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能).采用版本控制系统(VCS)是个明智的选择.有了它你就

Android数据库高手秘籍(三)——使用LitePal升级表

在上一篇文章中,我们学习了LitePal的基本用法,体验了使用框架来进行创建表操作的便利.然而大家都知道,创建表只是数据库操作中最基本的一 步而已,我们在一开始创建的表结构,随着需求的变更,到了后期是极有可能需要修改的.因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就 一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法.如果你还没有看过前一篇文章,建议先去参考 一下 Android数据库高手秘籍(二)——创建表和LitePal的