首先要明白SQLite是什么?我们为什么要在Android工程中应用它?
SQLite是一款轻量级的数据库,它具有如下特性(摘自百度百科):
由此可见,它在Android中开发的优势所在。
现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧。对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。
- 关于数据类型
和其他的数据库不同的是,sqlite是无类型的。也就是当你创建一个表格时,无需对每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite会自动找到存入的数据的类型。
SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如VARCHAR、NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、NATl0NAI、VARYINGCHARACTER。这些数据类型都是SQL92标准中规定的标准数据库数据类型,
至于基本操作方法,由于以前有过相关基础,再加上API文档的辅助,故不在本文赘述。下面重点研究在Android中调用数据库资源的方法。
- adb shell方式直接操作
说白了,adb shell就是一个android模拟器的后台资源调用器。它的操作方式和命令提示符差不多——以命令行的方式进行。
既然是模拟器的后台资源调用器,那当然得先打开android模拟器了。
打开模拟器后,再打开命令提示符,在里面输入adb shell,这时会出现一个#号,之后的操作同linux控制台下操作相同。
- 通过有关java类提供的方法进行操作
Android中对数据库进行操作的相关的借口、类等都在andorid.database和android.database.sqlite两个包里面。里面存在着很多的与数据库操作相关的类,但是在平时普通的开发中最经常遇到的仅仅就是那几个类而已,所以在这里我就省去通篇的介绍,对一些常用的接口、类做一下简介(部分总结来源于其他博客)。
①SQLiteDatabase(android.database.sqlite.SQLiteDatabase)
文档信息:
- public class SQLiteDatabase
Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.
这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
重要方法介绍:
- public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)
- public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory则是一个产生Cursor对象的工厂类。
- public long insert (String table, String nullColumnHack, ContentValues values)
看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。
- public int delete (String table, String whereClause, String[] whereArgs)
用于删除表中的数据。
- public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
名字很长是吧,它的功能也很强大,用于查询数据库中的数据。
- public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
用于修改数据。根据传入参数的名字可以对使用方法略知一二。
- public void execSQL (String sql, Object[] bindArgs)
- public void execSQL (String sql)
这是我个人认为最为重要的方法。这个方法用于执行你用String表示的非查询(因为它不会返回一个Cursor对象)的sql语句,例如CREATE,SELECT等。遗憾的是现在尚无法一次调用该方法来执行用“;”分开的多条sql语句。第二个重写方法使用的更多些。
- public void close ()
用来关闭数据库并释放数据库占用的相关资源。
②SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)
文档信息:
- public abstract class SQLiteOpenHelper
简介:
正如它的名字所表述的一样,这个抽象类是一个辅助类(Helper),用来打开(若数据库已存在)或创建数据库的。关于抽象类我们都知道,如果要使用它,一定是继承它。所以使用它都是通过自己定义一个类继承于它,并实现onCreate(SQLiteDatabase) , onUpgrade(SQLiteDatabase, int, int) , onOpen(SQLiteDatabase)三个方法。
在我看来,所谓的辅助类,其实就是充当了一个封装器——也就是说用于对其辅助的类实现一个java上的封装。在这里,SQLiteOpenHelper就是用来对SQLiteDatabase进行一个封装处理。
它包含的方法如下:
- synchronized void close()
关闭任何已开启的数据库对象。
- synchronized SQLiteDatabase getReadableDatabase()
创建或打开一个仅仅可读的(read-only)数据库。
- synchronized SQLiteDatabase getWritableDatabase()
- abstract void onCreate(SQLiteDatabase db)
- void onOpen(SQLiteDatabase db)
- abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
③Cursor(android.database.Cursor)
文档信息:
- public interface Cursor
This interface provides random read-write access to the result set returned by a database query.
简介:
Cursor没有构造方法,只能通过query方法获得。
前面提到了,execSQL方法无法执行与查询相关的sql语句,是因为无法返回一个Cursor对象——查询需要将查到的结果(就是表中的哪一行满足查询条件)返回,execSQL是返回void的,所以无法操作查询语句。从这里可以了解到,Cursor接口从某种意义上说就是为了弥补这一点的——query方法就是返回了一个Cursor对象。从名字上看,它的意思是游标,所以大概可以猜到他起到了一个指代的作用(事实上就是的,它指代数据库中保存数据的表的一行,并且还可以简单的处理该行数据项的信息)。从类的描述看,Cursor提供了对一个数据库查询动作返回结果束的随机读写途径,也就是说,它是一个对查询操作返回结果进行进一步处理的类,而这些处理就是用Cursor里的方法实现的。
结合SimpleCursorAdapter这个适配器类,你可以很方便的将数据库中的数据显示到AdapterView(例如ListView,GridView)中——这也是Cursor的另一大用处。
一些常用的方法有:
- public abstract boolean moveToPosition (int position)
- public abstract boolean moveToFirst ()
- public abstract boolean moveToLast ()
- public abstract boolean moveToLast ()
- public abstract boolean moveToPrevious ()
把这些方法放在一起的目的很明显:它们都是对Cursor指向的位置进行操作的方法——移到某个指定的位置、移到第一行、移到最后一行、移向下一行、移向上一行等等。
- public abstract int getCount ()
返回Cursor指向的表含有的总数据项数。
- public abstract boolean requery ()
Cursor是被一个query方法产生的,而这个方法就是将那个query方法所做的查询动作再执行一遍——这将会改变调用该方法的Cursor对象的值,也就是说,Cursor使用了该方法后就复位了。
- public abstract boolean isClosed ()
- public abstract boolean isFirst ()
- public abstract boolean isLast ()
- public abstract boolean isNull (int columnIndex)
- public abstract boolean isClosed ()
- public abstract boolean isBeforeFirst ()
在java中,类似于isWhatever形式的方法大都是对对象状态进行判断的方法——Whatever成立则返回true,不成立则返回false。这些方法也不例外。
值得提一下的是isNull方法,该方法测试某个栏位所保存的信息是否为NULL。参数columnIndex代表了那个栏位的代号。