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

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

 Byte
Long
Short
Integer
Float
Double
String
Boolean
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, );
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")) == ? 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个参数:

 String table
String[] columns
String selection
String[] selectionArgs
String groupBy
String having
String orderBy
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

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

  1. Android数据库使用指南(下)

    前言 上面已经说了,对表进行修改,其实就是对数据库进行升级,删除表也算升级啊,反正就是发生变化,数据库就需要升级. 所以老实说其实有个地方决定了数据库的版本 public class DBHelper ...

  2. Android Realm数据库使用指南

    Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...

  3. Android数据库信息显示在listview上

    Key Points: 1.使用SimpleCursorAdapter将Android数据库信息显示在listview上 adapter = new SimpleCursorAdapter(this, ...

  4. 小米红米1 android 4.4.4上操作数据库异常问题

    产生的问题: 小米红米1 android 4.4.4上,按HOME键,应用进入后台,再启动,应用进程直接挂掉 解决的方法: 这个是操作数据库,数据库关闭之后导致的异常,解决的方法: //4.0以上的版 ...

  5. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

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

    1.Android数据库简单介绍 Android通过结合使用SQLite数据库和Content Provider,提供了结构化数据的持久功能. SQLite数据库能够通过一种结构化的.易于管理的方法来 ...

  7. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  8. 《Android编程权威指南》

    <Android编程权威指南> 基本信息 原书名:Android programming: the big nerd ranch guide 原出版社: Big Nerd Ranch Gu ...

  9. 最全面的 Android 编码规范指南

    最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Go ...

随机推荐

  1. Vue 项目构建

    一.初始化项目 1.vue init webpack (fileName) 2.项目名称 3.项目描述 4.项目作者 5.是否依赖 .Vue 文件开发 第一个选项可以不依赖 .Vue 文件开发, 第二 ...

  2. linux 系统环境变量配置

    使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...

  3. 网站模板-Layui:Layui

    ylbtech-网站模板-Layui:百科 layui,是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的 ...

  4. 【MAC】 命令行解压缩 rar 文件

    使用Mac解压rar文件很简单,总共分2步.step1:安装解压工具,step2:解压 1.使用Homebrew安装unrar brew install unrar 2.cd到rar文件的目录下,然后 ...

  5. 设计模式(2): 响应store中数据的变化

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. store里面响应数据变化 通常情况下,我们会把数据存在store里面 ...

  6. 初识Nginx及其LNMP搭建

    Nginx介绍 nginx www服务软件 俄罗斯人开发 开源 性能很高 web产品 大小780k c语言开发 本身是一款静态www软件,不能解析php jsp .do 最大特点 静态小文件(1m), ...

  7. Python 笔试集(3):编译/解释?动态/静态?强/弱?Python 是一门怎样的语言

    面试题 解释/编译?动态/静态?强/弱?Python 到底是一门怎样的语言? 编译 or 解释? 编译.解释都是指将(与人类亲和的)编程语言翻译成(计算机能够理解的)机器语言(Machine code ...

  8. 郝斌_GUI

    85事件处理 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java ...

  9. python使用相对路径创建文件夹

    两个py文件,一个是al文件夹下的test1.py,一个是和al文件夹同层的test2.py test1.py代码如下: import os def test(): path = './source_ ...

  10. eclipse code recommenders cannot download its model repository index

    Cent OS 7 运行 eclipse oxygen 代码提示出现标题所示的错误,解决办法,将网络提供程序设置为手动即可解决. Window->Preference->General-& ...