Android 完整地支持 sqlite数据库,而且一个APP不能访问其他APP的数据库。
1、查看AndroidAPI,看到有两个package与数据库相关:android.database 和android.database.sqlite。
android.database 用于与ContentProvider交互的;直接操作数据库的API位于 android.database.sqlite。
2、查看Dev Guide ->Data Storage这份文档。讲解了一些常用的存储数据的方法,不过对于直接操作数据库的内容只是略微提及,并没有详细讲解。
3、查看Android SDK中的 sqlite3这个工具的用法(可以在PC上试用一下这个软件)
4、到 sqlite 的官方网站逛一逛,网址http://www.sqlite.org。然后把它的参考手册下载回来,因为在开发的时候会用到。
手工操作一下数据库,熟悉一下sqlite3这个工具。
1、首先启动虚拟机或者将手机连接到PC,执行 adbshell,进入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语句的写法。
手工操作了一下数据库之后,然后就开始利用AndroidAPI编写访问数据库的Java程序。
大致了解一下android.database.sqlite包中的各个类的用途:
1、SQLiteCloseable抽象类,一般不直接用这个类(它主要是提供一个接口,提供了c lose()方法)
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类,并实现它的回调函数。这个类的最主要作用就创建数据库,返回数据库调用接口:
[java] viewplaincopyprint?- publicclassDictionaryOpenHelperextendsSQLiteOpenHelper{
- privatestaticfinalintDATABASE_VERSION=2;
- privatestaticfinalStringDICTIONARY_TABLE_NAME="dictionary";
- privatestaticfinalStringDICTIONARY_TABLE_CREATE=
- "CREATETABLE"+DICTIONARY_TABLE_NAME+"("+
- KEY_WORD+"TEXT,"+
- KEY_DEFINITION+"TEXT);";
- DictionaryOpenHelper(Contextcontext){
- super(context,DATABASE_NAME,null,DATABASE_VERSION);
- }
- @Override
- publicvoidonCreate(SQLiteDatabasedb){
- db.execSQL(DICTIONARY_TABLE_CREATE);
- }
- }
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运算符),即可访问数据库了。典型的访问数据库的代码如下:
[java] viewplaincopyprint?- DictionaryOpenHelperhelper=newDictionOpenHelper(getApplicationContext());
- SQLiteDatabasedb=helper.getWritableDatabase();
- Stringdelete="DELETEFROM"+Dictionary.TABLE_NAME+
- "WHEREyear="+year+"ANDmonth="+month+";";
- db.execSQL(delete);
- db.close();
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、如果数据库要提供数据给 ContentProvider,那么需要包含一个字段,名称为 BaseColumn._ID。
2、我在做开发的时候,遇到的麻烦问题就是SQL字符串比较复杂,容易出错,把SQL传过去报错的话
不能马上发现错误。
http://blog.csdn.net/smfwuxiao/article/details/7213892