Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都至关出色,功能也很是的强大。SQLite具有下列特色:java
1.轻量级:使用 SQLite 只须要带一个动态库,就能够享受它的所有功能,并且那个动态库的尺寸想当小。android
2.独立性:SQLite 数据库的核心引擎不须要依赖第三方软件,也不须要所谓的“安装”。shell
3.隔离性:SQLite 数据库中全部的信息(好比表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。数据库
4.跨平台:SQLite 目前支持大部分操做系统,不至电脑操做系统更在众多的手机系统也是可以运行,好比:Android。编程
5.多语言接口:SQLite 数据库支持多语言编程接口。安全
6.安全性:SQLite 数据库经过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程能够在同一时间从同一数据库读取数据,但只能有一个能够写入数据。ide
Android为了让咱们可以更好的管理数据库,专门提供了一个SQLiteOpenHelper帮助类,这是一个抽象类,所以要使用的话须要建立一个本身的帮助类去继承它。SQLiteOpenHelper类中有两个抽象方法,分别是onCreate(),和onUpgrade(),帮助类中必须重写这两个方法,而后在这两个方法中去实现建立、升级数据库的逻辑。SQLiteOpenHelper中有两个重要的实例方法,getWritableDatabase()和getReadableDatabase().这两个方法均可以建立或打开一个现有数据库(若是数据库已经存在,则直接打开,不然建立一个新的数据库),并返回一个数据库的写读操做对象。不一样的是当数据库不可吸入的时候(如磁盘已满)getReadableDatabase()的方法返回的对象将以只读的方式打开数据库,而getWritableDatabase()则抛出异常。函数
SQLiteOpenHelper中有两个构造方法可供重写,通常使用参数较少的那一个,即public DatabaseHelper(Context context, String name, CursorFactory factory, int version),其中第一个参数是Context,必须有它才能对数据库进行操做,第二个参数是数据库的名字,第三个参数容许咱们在查询数据时返回一个Cursor,通常传入为null,第四个参数是数据库的版本号,可用于对数据库的升级。经过代码实现以下:this
新建项目MySQLiteTest:在新建一个DatabaseHelper.java类,继承SQLiteOpenHelper,同时修改activity_main.xml文件,添加以下代码:spa
<Button android:id="@+id/create_database" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="建立数据库"/> <Button android:id="@+id/add_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/create_database" android:text="添加数据"/> <Button android:id="@+id/up_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/add_data" android:text="更新数据"/> <Button android:id="@+id/delete_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/up_data" android:text="删除数据"/> <Button android:id="@+id/query_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/delete_data" android:text="查询数据"/> <Button android:id="@+id/replace_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/query_data" android:text="使用事务替换数据"/>
在DatabaseHelper.java类中 新建一张Book表
public class DatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK="create table Book(" +"id integer primary key autoincrement," +"author text," +"price real," +"page integer," +"name text)"; private Context myContext; public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub myContext=context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(CREATE_BOOK); Toast.makeText(myContext, "Create Success", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
这里把建表的语句定义成一个字符串常量,而后在onCreate()方法中调用SQLiteDatabase的execSQL()方法来执行这条语句,并弹出“Create Success”,这样便可以保证在数据库建立完成的同时建立Book表。
而后在MainActivity.java中点击建立数据库的按钮,代码为:
定义一些变量:
private Button CreatBsesBtn;//建立数据库 private Button addDataBtn;//添加数据 private Button udDataBtn;//更新数据 private Button deleteDataBtn;//删除数据 private Button queryDataBtn;//插叙数据 private Button replaceDataBtn;//替换数据 private DatabaseHelper mydb;
mydb=new DatabaseHelper(this, "BookStore.db", null, 1); //添加数据库 CreatBsesBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mydb.getWritableDatabase(); } });
这里经过构建一个DatabaseHelper,并经过构造函数的参数将数据库的名字指定为BookStore.db,版本号为1,而后在点击事件中调用getWritableDatabase()方法。这里查看不具体说明,能够用adb shell来对数据库和表的建立状况进行检查,具体配置不在说明。
下面不具体说明,看代码:
添加数据:
//添加数据 addDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); ContentValues cv=new ContentValues(); //添加数据 cv.put("name", "Android"); cv.put("author", "jesson"); cv.put("page", 120); cv.put("price", 75.0); db.insert("Book", null, cv); cv.clear(); db.insert("Book",null, cv); } });
在这个事件里,先获取到SQLiteDatabase对象,而后使用ContentValues来对要添加的数据进行组装,由于id那一列设置的是自动增加,所以这里只需四列就好了。最后调用insert()方法进行数据插入。
更新数据:
//更新数据 udDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put("prices", 18.32); db.update("Book", cv, "name=?", new String[]{"Android"}); } });
这里使用update()方法去执行具体更新操做,使用第三四个参数来指定具体更新的是哪一行的,也就是:将书名为Android的书本价格改成 18.32(原来是75.0)。
删除数据:
//删除数据 deleteDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); db.delete("Book", "page>?", new String[]{"500"}); } });
这里使用delete()方法去执行删除操做,使用第二三个参数来指定具体删除的是哪一行,这里删除页数超过50页的书。
//查询操做 queryDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); //查询表中全部数据 Cursor cursor=db.query("Book", null, null, null, null, null, null); if(cursor.moveToFirst()){ do{ String name=cursor.getString(cursor.getColumnIndex("name")); String author=cursor.getString(cursor.getColumnIndex("author")); int page=cursor.getInt(cursor.getColumnIndex("page")); double price=cursor.getDouble(cursor.getColumnIndex("price")); }while(cursor.moveToNext()); } cursor.close(); } });
SQLiteDatabase中提供一个query()方法对数据进行查询,这个方法比较复杂,最短有七个参数,分别以下表所示:
query()方法参数 | 描述 |
table | 指定查询的表名(可为null) |
columns | 指定查询的列名(可为null) |
selection | 指定where的约束条件(可为null) |
selectionArgs | 为where中的占位符提供具体的值(可为null) |
groupBy | 指定须要group by的列(可为null) |
having | 对group by后的结果进一步约束(可为null) |
orderBy | 指定查询结果的排序方式(可为null) |
调用query()方法后会返回一个Cursor对象,查询到的全部数据都将从这个对象中取出。在本次查询中,咱们在获得Cursor对象后,调用它的moveToFirst()方法将数据的指针移动到第一行的位置,而后进入一个循环当中,去遍历查询到的每一行数据。在这个循环中,能够经过getColumnIndex()方法获取到每一列在表中对应的位置索引。最后别忘了关闭Cursor.
事务的使用,在下一篇里进行介绍。