Android数据存储之操作SQLite

来源:互联网 发布:adobe for mac 编辑:程序博客网 时间:2024/05/01 19:38

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

运行结果:






0 0