1, 真正的数据库储存——SQLite数据库
概述:这是安卓推出的,用于移动端的,轻量级数据库,用于处理那些数据量大,结构复杂的数据,它比一般的数据库要简单的多,甚至不需要设置账号和密码,并且运行速度非常快,占用资源也极少(通常几百k即可)
可以使用标准的SQL语句控制,还遵循了数据库的ACID事物,所以以前使用过数据库的盆友,基本上可以简略的扫过本文章。
首先这个SQL数据库在安卓的包中以SQLiteDatabase类封装。
要使用这个类,需要用SQLiteOpenHelper抽象类封装(这是一个帮助类),其中要重写一些方法。
方法&属性介绍:
onCreate()方法:
定义类:SQLiteDatabase
特性:非静态方法,用于创建数据库
参数:SQLiteDatabase对象
返回值:无
onUpdate()方法:
定义类:SQLiteDatabase
特性:非静态方法,用于更新数据库
参数:SQLiteDatabase,数据库老的版本(int类型),新数据库类型
返回值:无
SQLiteDataBaseHelper的构造方法(参数较少的那个即可):
定义类:SQLiteDataBaseHelper
特性:用于进行数据库的一系列操作的前提
参数:Context,库名(数据库名String类型),返回自定义的Cursor(光标)<一般传入null即可>,int类型的当前数据库版本号。
返回值:无
getReadableDatabase()方法:
定义类:SQLiteDataBaseHelper
特性:非静态,用于创建或打开数据库,并返回一个可供读的操作的对象。
参数:无
返回值:SQLiteDataBase对象
getWritableDatabase()方法:
定义类:SQLiteDataBaseHelper
特性:非静态,用于创建或打开数据库,并返回一个可供写的操作的对象。
参数:无
返回值:SQLiteDataBase对象
注意:
1, SQLiteDatabase对象的创建,一般调用的是DataBaseHelper子类的构造方法,而并非直接调用SQLiteDataBase的构造方法,当系统查询无当前数据库名时,会在系统中创建相应的数据库。
2, SQLiteDataBase对象的升级,只要再次调用其构造方法,将最后一个参数传入比之前第一次调用的值大的一个数字即可,这样就可以调用onUpdate()方法。
3, 这里onUpdate()方法,和onCreate()方法的调用都是有条件的,不能直接调用。
数据库最重要的方法(CRDU,增删更查):
与SQL数据库不同,这里安卓有一系列的数据调用新方法,也可以直接用SQL数据库的习惯,调用。
Put()方法:
定义类:ContentValues
特性:非静态方法,用于构造ContentValues对象所携带的数据
参数:键值对,键为String类型,值无要求。
返回值:无
Clear()方法:
定义类:ContentValues
特性:非静态方法,用于清除ContentValues对象所携带的数据
Insert()方法:
定义类:SQLiteDatabase
特性:非静态方法,用于插入数据
参数:String类型的数据类别(自定义类别,如Book等),未指定添加数据的情况下给某些可为空白的列表自动赋值为NULL(一般只要传null,即可),ContentValues对象(用于一次性,将一类对象的所有参数传入)。
返回值:无
Update()方法:
定义类:SQLiteDatabase
特性:非静态方法,用于更新
参数:表名(String类型),ContentValues对象,三参、四参用于约束更新对象的行列中的数据。(也可理解为占位和值的关系)(如:“price=?”,3.88))(不指定则自动更新所有行)
返回值:无
delet()方法:
定义类:SQLiteDatabase
特性:非静态方法,用于删除
参数:表名(String类型),二参,三参与上述相类似也是回答:where,what两个问题的。(不指定则删除所有行)
返回值:无
query()方法
定义类:SQLiteDatabase
特性:非静态方法,用于查询数据,返回一个Cursor对象用于获取数据
参数(只介绍最简单的):表名,三参,四餐用于指定查询的行位置,和查询几行,如果不指定则查询所有,五参用于指定需要group by的列,不指定则不对其进行group by操作。
六参用于对group by之后的数据进行进一步过滤,不指定则不过滤,七参用于指定查询结果的排列方式,不指定则默认方式排列。
返回值:Cursor类型对象(光标)
Cursor是一个抽象类(在android.database中)其中包含了许多方法用于得到返回的数据
moveToFirst()方法:
定义类:Cursor
特性:非静态方法,用于将光标移动到第一个位置
参数:无
返回值:boolean类型,表示该操作是否实现
getClumIndex()方法:
定义类:Cursor
特性:非静态方法,用于读取相应键后面的值
参数:行的名称(之前存放时用的“键”)
返回值:int类型的值
getXXX()方法:
定义类:Cursor
特性:类似SharedPreferences中的方法,取出相应的数据类型。
参数:int类型的ClumIndex,参数的值(所要参数的值一般嵌套getClumIdex())
返回值:XXX数据类型
close()方法:
定义类:Cursor
特性:非静态方法,用于关闭光标读取的文件
参数:无
返回值:无
也可以通过SQL直接操作数据库:
通过execSQL()方法实现,这里属于SQL的知识,不过多涉及。
但必须有所了解,因为至少要使用这条语句先建立一个表格,才能使用上述方法进行增删改查。
查看数据库内容方法操作:
这里由于博主,用的是windows操作系统,暂且先介绍windows下数据库的查看方法。
此时该数据库,终于不能在FileExplorer视图下查看了。此时要用到的是SDK中的一个调试工具。
存放在platform-tools下,若想用命令提示符打开该工具,要将该工具的路径配置到环境变量中。
然后即可使用这款工具:adb shell
在命令提示符中写:adb shell即可打开
由于该软件由一位编安卓底层工程师设计,也就是基于Linux的,Linux中的代码习惯,在该软件中得以体现,例如:使用cd而非cd/d转到某某目录下。
转到data->data->包-project名->databases(提示:在不知道接下来目录是什么的时候,可以使用ls这个linux中常见的命令)
然后用sqlite3 <数据库名>打开数据库
.table 命令看到表格(其中android_metadata是自动生成的表格<一定存在>)
然后使用.schema可以看到建表语句(其中的逻辑关系,和类型)
建表之后
可以使用select*from <表名>进行查看内容了
如此可以简单进行数据的长久储存了。
案例:
实现创建数据库,并向其中传入数据,由于案例较简单,在此不进行赘述。
看图: