安卓手机的存储方式,主要有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("小花"));
}
运行结果: