安卓手机的存储方式,主要有File,数据库,SharePreFerence和网络等等。这里我们讲讲android上数据库的使用。常见的数据库比如Oracle,SQL Server和MySQL,这些都是主流的数据库,但是放在手机上实在是太“重量化”了。所以Android提供了SQLiteDatebase。这是一种轻量化的数据库,用户不必过多关心表的存储关系,直接用就行了。而且为了方便,系统也提供了可以不需要SQL语句的数据库操作(这个在下面的例子会有实现)。当然,常用的增删改查SQL语句应该是每一位开发人员都要掌握的,所以SQLite是直接支持用SQL语句去操作的。


数据的应用场景会是哪些? 最典型的莫过于充当缓存,将一些比如新闻的文本信息等等本地化存储在一张表里面,方便管理和查找。也可以将对象的属性存在特定表。但是既然是本地化存储,也需要注意安全的问题,不建议将密码和一些重要的用户名直接存储在数据库,如果有必要,需要加密存储。


SQLite中,我们一般通过子类去继承SQLiteOpenHelper,然后使用这个子类去创建和管理数据库表,而不是直接使用SQLiteOpenHelper这个类。SQLiteOpenHelper已经提供了我们常见的insert(增),delete(删),update(改)和query(查)操作。


主要方法说明:

SQLiteOpenHelper.getReadableDatabase()  通过读的方式打开数据库,用于查找操作。

SQLiteOpenHelper.getWritableDatabase()  通过读写的方式打开数据库,用于增删改操作。

SQLiteDatabase.execSQL( String SqlStr)   执行SQL语句。

SQLiteDatabase.rawQuery( String SqlStr)   执行SQL查询语句。


下面直接上例子,代码中已经涉及几乎所有常用的方法:

实现SQLiteOpenHelper的子类DBOpenHeler:

/**
 * 继承SQLiteOpenHelper必须实现两个方法:onCreate()和onUpgrade()
 * @author Alex Tam
 *
 */
public class DBOpenHeler extends SQLiteOpenHelper{
	private static final String DB_Name = "mydatabase.db";
	private static final int VERSION = 1;
	
	
	public DBOpenHeler(Context context) {
		super(context, DB_Name, null, VERSION);
	}
	
	public DBOpenHeler(Context context, String name, CursorFactory factory,
			int version) {
		super(context, DB_Name, null, VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// 当本地不存在数据库,就会在这个onCreate()方法中生成该数据库表
		// 只有在第一次生成数据库时才会调用该方法
		//这里创建了名为testdb的表,_id为自增长的主键,name和year用来保存姓名和年龄
		db.execSQL("CREATE TABLE IF NOT EXISTS testdb (_id integer primary key autoincrement,name varchar(100),year INTEGER) ");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// 当数据库的版本发生变化时会调用该方法,发生变化时,oldVersion是旧的版本号,newVersion是新版本号
		//在开发过程中,只要调用db.setVersion(version)方法去人为的更新版本号,就会自动回掉这个onUpgrade()方法
	}
	
}




然后封装一下数据库的各个操作方法:

DAOHelper:

/**
 * @author Alex Tam
 *
 */
public class DAOHelper {
	//通过dbOpenHeler来实现操作数据库
	private DBOpenHeler dbOpenHeler;
	
	
	public DAOHelper(Context context)
	{
		dbOpenHeler = new DBOpenHeler(context);
	}
	
	/**
	 * 保存数据
	 * @param name 姓名
	 * @param year	年龄
	 */
	public void save(String name , int year)
	{
		//以读写的方式打开数据库
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		//开启事务
		db.beginTransaction();
		try {
			db.execSQL("insert into testdb(name , year) values(?,?)", new Object[]{name, year});
			//标记事务成功,提交事务
			db.setTransactionSuccessful();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//结束事务
			db.endTransaction();
		}
		db.close();
	}
	
	//删除
	public void delete(String name)
	{
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		db.execSQL("delete from testdb where name = ?",new Object[]{name});
		db.close();
	}
	
	//更新
	public void update(String name , int year)
	{
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		db.beginTransaction();
		try {
			db.execSQL("update testdb set year = ? where name = ?",new Object[]{year, name});
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
	}
	
	//查询
	public int find(String name)
	{
		int year = 0;
		//通过读的方式打开数据库
		SQLiteDatabase db = dbOpenHeler.getReadableDatabase();
		db.beginTransaction();
		try {
			Cursor cursor = db.rawQuery("select year from testdb where name = ?",new String[]{name});
			if(cursor.moveToFirst())
			{
				year = Integer.valueOf(cursor.getInt(0));
			}
			cursor.close();
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
		return year;
	}
	
	
	/*********************** 下面使用Android提供的不是通过SQL语句的方法去操作数据库 *****************************/
	
	//保存
	public void saveByDefault(String name,int year)
	{
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		db.beginTransaction();
		try {
			ContentValues values = new ContentValues();
			values.put("name", name);
			values.put("year", year);
			//这里如果values为空,也不会影响insert的操作,照样会在数据库创建新的id不为空而其他字段值为空的记录
			db.insert("testdb", null, values);
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
	}
	
	//删除
	public void deleteByDefault(String name)
	{
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		db.beginTransaction();
		try {
			db.delete("testdb", "name like ?", new String[]{name});
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
	}
	
	//更新
	public void updateByDefault(String name,int year)
	{
		SQLiteDatabase db = dbOpenHeler.getWritableDatabase();
		db.beginTransaction();
		try {
			ContentValues values = new ContentValues();
			values.put("name", name);
			values.put("year", year);
			db.update("testdb", values, "name like ?", new String[]{name});
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
	}
	
	//查询
	public int findByDefault(String name)
	{
		int year = 0;
		SQLiteDatabase db = dbOpenHeler.getReadableDatabase();
		db.beginTransaction();
		try {
			//按主键倒序的顺序,查找1 到 3条数据中,n姓名字段包含关键字name的记录
			Cursor cursor = db.query("testdb", new String[]{"year"}, "name like ?", new String[]{"%" + name + "%"}
				, null, null, "_id desc", "1,3");
			if(cursor.moveToFirst())
			{
				year = Integer.valueOf(cursor.getInt(0));
			}
			cursor.close();
			db.setTransactionSuccessful();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction();
		}
		db.close();
		return year;
	}
	
	

}




上面主要是一个记录姓名和年龄的数据库。最后来运行一下:

private void testDB()
	{
		DAOHelper helper = new DAOHelper(mContext);
		helper.save("小明", 12);
		helper.save("黄萧峰", 25);
		helper.save("marry", 33);
		helper.save("john", 18);
		helper.save("小花", 20);
		
		Log.e("搜索结果", " -----> " + helper.find("黄萧峰"));
		Log.e("搜索结果", " -----> " + helper.findByDefault("小花"));
	}



运行结果:

android studio 打开sqlite文件 安卓打开sql_sqlite