(一)、简介:
Android通过 SQLite 数据库引擎来实现结构化数据的存储。在一个数据库应用程序中,任何类都可以通过名字对已经创建的数据库进行访问,但是在应用程序之外就不可以。
SQLite 数据库是一种用C语言编写的嵌入式数据库,它是一个轻量级的数据库,最初为嵌入式设计的。它是在一些基础简单的语句处理上要比oracle / mysql快很多,而且其对内存的要求很低,在内存中只需要几百KB的存储空间。这是Android中采用 SQLite 数据库的主要原因。
SQLite 支持事务处理功能。Transaction
SQLite 处理速度比MySQL等著名的开源数据库系统更快。它没有服务器进程。
SQLite 通过文件保存数据库,该文件是跨平台的,可以自由复制。一个文件就是一个数据库。数据库名即文件名。
JDBC会消耗太多系统资源,所以JDBC对于手机并不合适,因此Android提供了新的API来使用 SQLite 数据库。
三、SQLiteDatabase类:
SQLiteDatabase等同于JDBC中Connection和Statement的结合体。SQLiteDatabase既代表与数据库的连接,又只能用于执行sql语句操作。
(一)、操作 SQLite 数据库的步骤:【重要】
1、创建 SQLiteDatabase 对象,它代表与数据库的连接;
2、创建数据库中的表(执行CREATE);
3、调用SQLiteDatabase 对象执行数据库操作(执行DML);
4、对查询后的结果集Cursor进行处理。
(二)、操作 SQLite 数据库的步骤详细讲解:
1、创建 SQLite 数据库对象:SQLiteDatabase对象代表一个数据库。 SQLiteDatabase提供了几个静态方法来打开一个文件对应的数据库。
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
【备注:】打开数据库的参数:
1、参数中的path代表着数据库的路径(如果是在默认路径/data/data/<package_name>/databases/下,则这里只需要提供数据库名称);
2、factory代表着在创建Cursor对象时,使用的工厂类,如果为null的话,则使用默认的工厂(这里我们可以实现自己的工厂进行某些数据处理);
3、flags代表的是创建表时的一些权限设置,多个权限之间用|分隔:
OPEN_READONLY :代表的是以只读方式打开数据库(常量值为:1)
OPEN_READWRITE:代表以读写方式打开数据库(常量值为:0)
CREATE_IF_NECESSARY:当数据库不存在时创建数据库
NO_LOCALIZED_COLLATORS:打开数据库时,不根据本地化语言对数据库进行排序(常量值为:16)
代码:
//当数据库存在时:
String path = SDCardHelper.getSDCardRoot() + File.separator + "steven" + File.separator + "android_manual.db";
SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READWRITE);
Cursor cursor = db.rawQuery("select * from android_basic order by id desc limit 0 , 15",null);
//当数据库不存在时:
String path = SDCardHelper.getSDCardRoot() + File.separator + "steven" + File.separator + "words.db";
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(path, null);
创建表:
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(path, null);
db.execSQL("create table tb_words (_id integer primary key autoincrement ,english , chinese)");
主意:
一。SQLite的数据类型?
首先你会接触到一个让你惊讶的名词: Typelessness(无类型)。其实SQLite是无类型的。这意味着你可以保存任何类型的数据到数据库表的任何列中, 无论这列声明的数据类型是什么。对于SQLite来说对字段不指定类型是完全有效的。如:create table dict(_id integer primary key autoincrement , word , detail);
注意:这里一定要注意,SQLite数据库在一种情况下是要求类型匹配的,当我们建表是如create table table1(id integer primary key),sqlite对应一位integer primary key的列值允许你存储64位的整数。必须是INTEGER PRIMARY KEY AUTOINCREMENT。
诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎时能起到一个提示或帮助的作用。
二、调用SQLiteDatabase 对象的方法执行数据库操作:【重要】
execSQL(String sql , Object[] args) 执行带占位符的sql语句(update,insert,delete语句)
rawQuery( String sql , String[] args ) 执行带占位符的sql查询(select语句)
beginTransaction() 开始事务
endTransaction() 结束事务
【备注:】除了以上重要的四个方法外,Android考虑到不熟悉sql语句的开发者,提供了进一步封装后的一系列方法。但是以下这几个方法参数众多,平时不建议使用,但是一定也要掌握,在ContentProvider中会有类似的方法,要注意区分。
insert()
update()
delete()
query()
三、对查询结果进行操作。当执行的是select语句,返回一个Cursor对象。Cursor类似于JDBC中的ResultSet结果集,内置移动游标等方法:
move(int offset) 按偏移量来移动
moveToFirst() 将记录指针移动到第一行
moveToLast () 将记录指针移动到最后一行
moveToNext () 将记录指针移动到下一行
moveToPosition(int position) 将记录指针移动到指定的一行
moveToPrevious() 将记录指针移动到上一行
getCount() 返回Cursor的行数
getColumnName(int index) 根据列的索引返回其相应的列名称
getColumnIndex(String name) 根据列的名字返回其相应的索引
getColumnNames() 返回一个保存有所有列名称的字符串数组
getColumnCount() 返回列的总数
close() 关闭游标结果集,释放资源
getType() 获取字段的数据类型。分别有0、1、2、3、4这几个结果。
0: 代表null
1:代表int
2:代表float
3:代表String
4:代表blob
(四)、事务:【重要】
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。事务的目的是为了保证数据的一致性。
你必须非常努力,才能看起来毫不费力......