SQLitehtml
Android对SQLite数据库,提供了彻底的支持,而全部建立的SQLite数据库,仅限于当前应用访问,若是其余应用须要访问,则必须提供的Content Provider的支持,而且SQLite数据库会随着Android应用的卸载而被删除。SQLite是一个嵌入式的数据库引擎,最后是以文件的形式保存数据的。从本质上来看,SQLite的操做方式只是一种更为便捷的文件操做,当应用程序建立或打开一个SQLite数据库时,其实只是打开一个文件准备读写。由于SQLite仅适用于资源有限的小型设备,因此自己就不该该把大量数据存储在设备的SQLite数据库里,SQLite只适合存储一些小型的数据。java
为了使SQLite和其余数据库间的兼容性最大化,SQLite支持对列上类型进行“类型近似”,列的类型近似指的是存储在列上的数据进行推荐类型存储。因此虽然SQLite内部只支持NULL、INTEGER、REAL(浮点书)、TEXT(文本)和BLOB(大二进制对象)这五种数据类型,但实际上SQLite彻底能够接受varchar(n)、char(n)、decimal(p,s)、date等类型数据,只不过SQLite会在运算或保存时将它们转换为上面五种数据类型中相应的类型。大多数数据库的引擎都是使用静态的、强类型的数据类型,数据的类型是由它的容器决定的,这个容器是指被存放的特定列。而SQLite使用的是动态类型,在SQLite中,值的数据类型跟值自己相关,而不是与它的容器相关,因此SQLite容许把各类类型的数据保存到任何类型字段中,开发者能够不用关心声明该字段说使用的数据类型。可是有一种状况例外,定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数意外的其余类型的数据时,SQLite会产生错误。android
SQLite数据库建立与维护sql
从官方文档上了解到,在Android项目中,建立SQLite数据库推荐继承SQLiteOpenHelper类,而后重写其中的onCreate()方法,在onCreate()方法中,对执行数据库建立的SQL语句。而SQLiteOpenHelper不单单用于SQLite数据的建立,还能够对其进行维护,以及得到SQLiteDatabase这个数据库操做对象。数据库
SQLiteOpenHelper提供了两个构造器,用于传递当前上下文对象以及SQLite数据库版本信息,在SQLiteOpenHelper的继承类的构造函数中,会调用它,构造器的签名以下:ide
上面的构造函数中,都是用于建立一个SQLite数据库,context为一个当前应用的上下文对象;name是数据库名称;factory是一个容许子类在查询时使用的游标,通常不用传Null;version是数据库版本号;errorHandler是一个接口,传递当数据库错误的时候,执行的补救方法。函数
在SQLiteOpenHelper中,能够进行SQLite数据库的建立、维护、日志以及获取可读写的数据库对象,经过下面几个经常使用方法获得支持:测试
下面提供一个简单的SQLiteOpenHelper的继承类代码,用于建立数据库以及表结构:spa
package com.leaf.android.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DbOpenHelp extends SQLiteOpenHelper { private static String name = "mydb.db";// 表示数据库名称 private static int version = 1;// 表示数据库的版本号码 public DbOpenHelp(Context context) { super(context, name, null, version); } // 当数据库建立的时候,是第一次被执行,完成对数据库的表的建立 @Override public void onCreate(SQLiteDatabase db) { // 支持的数据类型:整型数据,字符串类型,日期类型,二进制的数据类型, String sql = "create table person(id integer primary key autoincrement,name varchar(64), address varchar(64))"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = "alter table person add sex varcha(8)"; db.execSQL(sql); } }
Tips:当建立好SQLite数据库的以后,能够在/data/data/<package name>/databases目录下找到SQLite数据库文件。日志
执行CRUD操做
当使用SQLiteOpenHelper的getReadableDatabase()或者getWritableDatabase()方法获取到SQLiteDatabase对象,就能够对这个数据库进行操做了。
对于熟悉SQL语句的开发者而言,其实只须要使用两个方法,便可执行全部CRUD操做,如下方法提供多个重载方法:
下面以一个示例讲解一下单纯使用SQL语句实现CRUD操做:
接口代码:
package com.leaf.android.service; import java.util.List; import java.util.Map; public interface PersonService { public boolean addPerson(Object[] params); public boolean deletePerson(Object[] params); public boolean updatePerson(Object[] params); public Map<String, String> viewPerson(String[] selectionArgs); public List<Map<String, String>> listPersonMaps(String[] selectionArgs); }
接口的实现代码:
package com.leaf.android.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.leaf.android.db.DbOpenHelp; import com.leaf.android.service.PersonService; public class PersonDao implements PersonService { private DbOpenHelp helper = null; public PersonDao(Context context) { helper = new DbOpenHelp(context); } public boolean addPerson(Object[] params) { boolean flag = false; // 实现对数据库的添加删除和修改查询的功能 SQLiteDatabase database = null; try { String sql = "insert into person(name, address, sex) value(?,?,?) "; database = helper.getWritableDatabase();// 实现对数据库的写的操做 // 执行SQL database.execSQL(sql, params); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { // finally中关闭数据库 database.close(); } } return flag; } public boolean deletePerson(Object[] params) { boolean flag = false; SQLiteDatabase database = null; try { // 删除一条数据 String sql = "delete from person where id = ?"; database = helper.getWritableDatabase(); database.execSQL(sql, params); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { database.close(); } } return flag; } public boolean updatePerson(Object[] params) { boolean flag = false; SQLiteDatabase database = null; try { String sql = "update person set name = ? , address = ?, sex = ?, where id = ?"; database = helper.getWritableDatabase(); database.execSQL(sql, params); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { database.close(); } } return flag; } public Map<String, String> viewPerson(String[] selectionArgs) { Map<String, String> map = new HashMap<String, String>(); SQLiteDatabase database = null; try { String sql = "select * from person where id = ?"; database = helper.getWritableDatabase(); Cursor cursor = database.rawQuery(sql, selectionArgs); // 得到数据库的列的个数 int colums = cursor.getColumnCount(); while (cursor.moveToNext()) { for (int i = 0; i < colums; i++) { String cols_name = cursor.getColumnName(i); String cols_value = cursor.getString(cursor .getColumnIndex(cols_name)); if (cols_value == null) { cols_value = ""; } map.put(cols_name, cols_value); } } } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { database.close(); } } return map; } public List<Map<String, String>> listPersonMaps(String[] selectionArgs) { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); String sql = "selece * from person"; SQLiteDatabase database = null; try { database = helper.getWritableDatabase(); Cursor cursor = database.rawQuery(sql, selectionArgs); int colums = cursor.getColumnCount(); while (cursor.moveToNext()) { Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < colums; i++) { String cols_name = cursor.getColumnName(i); String cols_value = cursor.getString(cursor .getColumnIndex(cols_name)); if (cols_value == null) { cols_value = ""; } map.put(cols_name, cols_value); } list.add(map); } } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { database.close(); } } return null; } }
再写一个测试类测试这个数据操做类是否有效
package com.leaf.android.test; import java.util.List; import java.util.Map; import android.test.AndroidTestCase; import android.util.Log; import com.leaf.android.dao.PersonDao; import com.leaf.android.db.DbOpenHelp; import com.leaf.android.service.PersonService; public class MyTest extends AndroidTestCase { private final String TAG = "main"; public MyTest() { } public void createDb() { DbOpenHelp helper = new DbOpenHelp(getContext()); helper.getWritableDatabase(); } public void insertDb() { PersonService service = new PersonDao(getContext()); Object[] params1 = { "张龙", "beijing", "male" }; boolean flag = service.addPerson(params1); Object[] params2 = { "赵虎", "shanghai", "male" }; flag = flag && service.addPerson(params2); Object[] params3 = { "王朝", "HK", "male" }; flag = flag && service.addPerson(params3); Object[] params4 = { "马汉", "beijing", "female" }; flag = flag && service.addPerson(params4); Log.i(TAG, "-----插入数据----->>" + flag); } public void deleteDb() { PersonService service = new PersonDao(getContext()); Object[] params = { 1 }; boolean flag = service.deletePerson(params); Log.i(TAG, "-----删除数据----->>" + flag); } public void updateDb() { PersonService service = new PersonDao(getContext()); Object[] params = { "张三", "上海", "男", "2" }; boolean flag = service.updatePerson(params); Log.i(TAG, "---------->>" + flag); } public void getDb() { PersonService service = new PersonDao(getContext()); Map<String, String> map = service.viewPerson(new String[] { "2" }); Log.i(TAG, "---------->>" + map.toString()); } public void listDb() { PersonService service = new PersonDao(getContext()); List<Map<String, String>> list = service.listPersonMaps(null); Log.i(TAG, "---------->>" + list.toString()); } }