每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
SQLite体系结构图如下:
编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协同处理文本形式的结构化查询语句。
后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者写入页面。
公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。
SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
1、轻量级
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。
二、导出查看数据库文件
在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/package_name/databases文件夹中。
想要将数据库文件导出可以使用eclipse,如图所示:
查看数据库,使用SQlite Database Browser,如图所示:
三、扩展类
3.1扩展SQLiteOpenHelper
Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
构造函数,调用父类 SQLiteOpenHelper 的构造函数
onCreate()方法;// TODO 创建数据库后,对数据库的操作(如数据库中的表没创建,则执行此方法。)
onUpgrage()方法。// TODO 更改数据库版本的操作(根据版本)
当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
操作数据库的最佳实践是创建一个辅助类,例如联系人模块
class ContactsDatabaseHelper extends SQLiteOpenHelper
3.2 Cursor类
3.3 数据类型
<pre name="code" class="java"><pre name="code" class="java">public class DBHelper extends SQLiteOpenHelper { private final static int DATABASE_VERSION=1;//数据库版本 private final static String DATABASE_NAME="MyDiary.db";// 数据库名 public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table myInfo(_id integer primary key autoincrement," + "title text ,date text,content text)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
新建一个DBService用于封装数据库的增删改查。 <div><span style="font-family: 'Microsoft YaHei', 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;"> </span></div><div><pre name="code" class="java">public class DBService { private DBHelper dbHelper; public DBService(Context context){ this.dbHelper=new DBHelper(context); } //添加信息 public void insert(Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("insert into myInfo values(null,?,?,?)" , new String[] { info.getTitle(), info.getDate(), info.getContent()}); db.close(); } //获取所有的信息 public List<Info> getAll(){ List<Info> list=new ArrayList<Info>(); SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor=db.rawQuery("select * from myInfo",null); if (cursor == null) { return list; } while(cursor.moveToNext()){ Info info=new Info(); info.setId(cursor.getInt(cursor.getColumnIndex("_id"))); info.setTitle(cursor.getString(cursor.getColumnIndex("title"))); info.setDate(cursor.getString(cursor.getColumnIndex("date"))); info.setContent(cursor.getString(cursor.getColumnIndex("content"))); list.add(info); } cursor.close(); db.close(); return list; } //更新 public void update( Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("update myInfo set title=?,date=?,content=? where _id=?", new String[] { info.getTitle(), info.getDate(), info.getContent(),info.getId()+"" }); db.close(); } //删除 public void delete(Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("delete from myInfo where _id=?", new String[] { info.getId() + "" }); db.close(); } //查询 public List<Info> getByTitle(String title) { List<Info> list=new ArrayList<Info>(); SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor=db.rawQuery("select * from myInfo where title like ?",new String[]{ "%"+title+"%" }); if (cursor==null){ return list; } while(cursor.moveToNext()){ Info info=new Info(); info.setId(cursor.getInt(cursor.getColumnIndex("_id"))); info.setTitle(cursor.getString(cursor.getColumnIndex("title"))); info.setDate(cursor.getString(cursor.getColumnIndex("date"))); info.setContent(cursor.getString(cursor.getColumnIndex("content"))); list.add(info); } cursor.close(); db.close(); return list; } }此后就可以在就可以在Activity中调用你所封装好的方法了。