Android 完整地支持 sqlite 数据库,而且一个APP不能访问其他APP的数据库。
1、查看Android API,看到有两个package与数据库相关:android.database 和 android.database.sqlite。
android.database 用于与Content Provider交互的;直接操作数据库的API位于 android.database.sqlite。
2、查看Dev Guide -> Data Storage 这份文档。讲解了一些常用的存储数据的方法,不过对于直接操作数据库的内容只是略微提及,并没有详细讲解。
3、查看Android SDK中的 sqlite3 这个工具的用法(可以在PC上试用一下这个软件)
4、到 sqlite 的官方网站逛一逛,网址 http://www.sqlite.org。然后把它的参考手册下载回来,因为在开发的时候会用到。
手工操作一下数据库,熟悉一下sqlite3这个工具。
1、首先启动虚拟机或者将手机连接到PC,执行 adb shell,进入android的shell
2、执行 sqlite3 命令(在andoid系统中执行,不是在PC端)。用真机执行的话需要root权限,建议在虚拟机中操作。
执行 sqlite3 命令的时候,可以带一个数据库的文件路径,例如
$ sqlite3 /data/data/com.android.providers.media/database/internal.db。
如果你有Linux的系统,完全可以在PC上试用sqlite3,跟Android上面的sqlite3是差不多的。
3、进入了 sqlite3 的终端,可以执行各种sqlite命令(提示:sqlite命令都是以句点符号开头,例如“.tables” 列出所有表格,“.databases”列出所有数据库,“.help” 查看帮助,“.exit” 退出)
4、在sqlite3的终端界面还可以执行SQL语句,例如 CREATE TABLE, SELECT 等等。参考sqlite官网了解SQL语句的写法。
手工操作了一下数据库之后,然后就开始利用Android API编写访问数据库的Java程序。
大致了解一下android.database.sqlite包中的各个类的用途:
1、SQLiteCloseable 抽象类,一般不直接用这个类(它主要是提供一个接口,提供了close()方法)
2、SQLiteCursor 保存查询操作返回的结果,类似于Content Provider返回的Cursor。
3、SQLiteDatabase 是访问sqlite数据库的最主要的类,提供了多个操作数据库的API(查询、插入、删除等)
4、SQLiteOpenHelper 是为了简化数据库操作而引入的类,也很常用(对于这个类,根据API文档的描述,需要覆盖它的几个onXXX() 回调函数,然后使用)
5、SQLiteProgram 表示一次sqlite查询操作(这个类的作用是提供一个基类,供继承的,一般不用)
6、SQLiteQuery 是一次查询,从SQLiteProgram继承而来。这个类要提供给SQLiteCursor才有用,它本身没什么用。
7、SQLiteQueryBuilder 是用于构造SQLiteQuery的工厂类,通过这个类建立SQLiteQuery,再把SQLiteQuery传给SQLiteCursor,做查询操作。
8、SQLiteStatement 表示一个提前编译好的SQL语句,而且这个语句只能返回一行一列数据,需要从SQLiteDatabase.compileStatement来创建(不要用构造函数创建),引入他的目的是为了复用。
典型开发步骤:
1、写一个类,继承 SQLiteOpenHelper类,并实现它的回调函数。这个类的最主要作用就创建数据库,返回数据库调用接口:
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
2、写好SQLiteOpenHelper子类之后,用构造函数实例化对象(用new运算符),即可访问数据库了。典型的访问数据库的代码如下:
DictionaryOpenHelper helper = new DictionOpenHelper(getApplicationContext());
SQLiteDatabase db = helper.getWritableDatabase();
String delete = "DELETE FROM " + Dictionary.TABLE_NAME +
" WHERE year=" + year + " AND month=" + month +";";
db.execSQL(delete);
db.close();
创建 helper,调用 helper 的 getReadableDatabase() / getWritableDatabase() ,得到SQLiteDatabase(数据库接口),然后用这个对象提供的API对数据库进行查询、插入、删除等各种操作。
3、如果要对数据库做查询操作,就调用 SQLiteDatabase 的 query() 函数,返回 Cursor 对象。
注意:
1、如果数据库要提供数据给 Content Provider,那么需要包含一个字段,名称为 BaseColumn._ID。
2、我在做开发的时候,遇到的麻烦问题就是SQL字符串比较复杂,容易出错,把SQL传过去报错的话
不能马上发现错误。