getReadableDatabase 和 getWritableDatabase的区别
(1)getWritableDatabase()方法以读写方式打开数据库。
一旦数据库的磁盘空间满了,数据库就只能读而不能写,此时用getWritableDatabase()打开数据库就会出错。
(2)getReadableDatabase()方法先调用getWritableDatabase()先以读写方式打开数据库。
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
一般避免报错都是用getReadableDatabase()方法
包结构一般这样:
MySqliteOpenHelper类:
public class MySqliteOpenHelper extends SQLiteOpenHelper { public MySqliteOpenHelper(Context context) { //context :上下文 , name:数据库文件的名称 factory:用来创建cursor对象,默认为null //version:数据库的版本号,从1开始,如果发生改变,onUpgrade方法将会调用,4.0之后只能升不能将 super(context, "info.db", null,1); } //oncreate方法是数据库第一次创建的时候会被调用; 特别适合做表结构的初始化,需要执行sql语句;SQLiteDatabase db可以用来执行sql语句 @Override public void onCreate(SQLiteDatabase db) { //通过SQLiteDatabase执行一个创建表的sql语句 db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(11))"); } //onUpgrade数据库版本号发生改变时才会执行; 特别适合做表结构的修改 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //添加一个phone1字段 // db.execSQL("alter table info add phone1 varchar(11)"); } }
InfoDao类(对info表进行增、删、改、查):
public class InfoDao { private MySqliteOpenHelper mySqliteOpenHelper; public InfoDao(Context context){ //创建一个帮助类对象 mySqliteOpenHelper = new MySqliteOpenHelper(context); } public boolean add(InfoBean bean){ //执行sql语句需要sqliteDatabase对象 //调用getReadableDatabase方法,来初始化数据库的创建 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); ContentValues values = new ContentValues();//是用map封装的对象,用来存放值 values.put("name", bean.name); values.put("phone", bean.phone); //table: 表名 , nullColumnHack:可以为空,标示添加一个空行, values:数据一行的值 , 返回值:代表添加这个新行的Id ,-1代表添加失败 long result = db.insert("info", null, values);//底层是在拼装sql语句 //关闭数据库对象 db.close(); if(result != -1){//-1代表添加失败 return true; }else{ return false; } } public int del(String name){ //执行sql语句需要sqliteDatabase对象 //调用getReadableDatabase方法,来初始化数据库的创建 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); //table :表名, whereClause: 删除条件, whereArgs:条件的占位符的参数 ; 返回值:成功删除多少行 int result = db.delete("info", "name = ?", new String[]{name}); //关闭数据库对象 db.close(); return result; } public int update(InfoBean bean){ //执行sql语句需要sqliteDatabase对象 //调用getReadableDatabase方法,来初始化数据库的创建 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); ContentValues values = new ContentValues();//是用map封装的对象,用来存放值 values.put("phone", bean.phone); //table:表名, values:更新的值, whereClause:更新的条件, whereArgs:更新条件的占位符的值,返回值:成功修改多少行 int result = db.update("info", values, "name = ?", new String[]{bean.name}); //关闭数据库对象 db.close(); return result; } public void query(String name){ //执行sql语句需要sqliteDatabase对象 //调用getReadableDatabase方法,来初始化数据库的创建 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); //table:表名, columns:查询的列名,如果null代表查询所有列; selection:查询条件, selectionArgs:条件占位符的参数值, //groupBy:按什么字段分组, having:分组的条件, orderBy:按什么字段排序 Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, "name = ?", new String[]{name}, null, null, "_id desc"); //解析Cursor中的数据 if(cursor != null && cursor.getCount() >0){//判断cursor中是否存在数据 //循环遍历结果集,获取每一行的内容 while(cursor.moveToNext()){//条件,游标能否定位到下一行 //获取数据 int id = cursor.getInt(0); String name_str = cursor.getString(1); String phone = cursor.getString(2); System.out.println("_id:"+id+";name:"+name_str+";phone:"+phone); } cursor.close();//关闭结果集 } //关闭数据库对象 db.close(); } }