关于Android中的SQLite数据库的使用
SQLite这种Android系统中自带的数据库软件虽然在项目中很少用到源生的,但是从我们学习的角度来说,还是非常有必要熟悉的。
1.创建OpenHelper类
public class BlackNumberOpenHelper extends SQLiteOpenHelper {
//设置数据库的信息,创建数据库
//name : 数据库的名称
//factory : 游标工厂
//version : 数据库的版本
public BlackNumberOpenHelper(Context context) {
super(context, BlackNumberConstants.DB_NAME, null, BlackNumberConstants.DB_VERSION);
}
//创建表结构
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(BlackNumberConstants.DB_SQL);
}
//更新数据库的时候调用的方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
这个类继承于SQLiteOpenHelper,用于获取SQliteDataBase,在这里数据库的名称,version,创建表的语句等都抽取到一个常量类中,用于后期方便更改
下面是抽取的代码
public interface BlackNumberConstants {
/** 数据库的名称 **/
public static final String DB_NAME = "blacknumber.db";
/** 数据库的版本 **/
public static final int DB_VERSION = 1;
// 为了方便后期修改表的名称和字段的名称,把表名和字段名也抽取出来
/** 表名 **/
public static final String TABLE_NAME = "info";
/** _id字段的名称 **/
public static final String ID = "_id";
/** 号码的字段的名称 **/
public static final String BLACKNUMBER = "blacknumber";
/** 类型的字段的名称 **/
public static final String MODE = "mode";
/** 创建表的sql语句 **/
public static final String DB_SQL = "create table " + TABLE_NAME + "(" + ID
+ " integer primary key autoincrement," + BLACKNUMBER
+ " varchar(20)," + MODE + " varchar(2))";
}
2.数据库的增删查改,直接上代码
/**
* 黑名单数据库的操作
*
* 2017-10-23 上午9:30:39
*/
public class BlackNumberDao {
private BlackNumberOpenHelper blackNumberOpenHelper;
public BlackNumberDao(Context context) {
blackNumberOpenHelper = new BlackNumberOpenHelper(context);
}
// 增删改查
/**
* 添加数据的操作
*
* @param blacknumber
* : 号码
* @param mode
* : 拦截类型 2017-10-23 上午9:30:45
*/
public boolean add(String blacknumber, int mode) {
SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// key:数据库表中的字段名
// values:添加的数据
values.put(BlackNumberConstants.BLACKNUMBER, blacknumber);
values.put(BlackNumberConstants.MODE, mode);
// 参数1:表名
// 参数2:Sqlite数据库不能直接添加null操作,如果添加数据是null,sqlite数据库会在添加数据相应的列中设置为null
// 参数3:添加的数据
long insert = database.insert(BlackNumberConstants.TABLE_NAME, null,
values);
// 判断是否添加成功的操作
return insert != -1;
}
/**
* 根据号码删除表中对应的记录
*
* @param blackNumber
* 2017-10-23 上午9:32:24
*/
public boolean delete(String blackNumber) {
SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
// whereClause : 查询条件
// whereArgs : 查询条件的参数(具体的值)
int delete = database.delete(BlackNumberConstants.TABLE_NAME,
BlackNumberConstants.BLACKNUMBER + "=?",
new String[] { blackNumber });
System.out.println(delete);
return delete != 0;
}
/**
* 根据号码更新拦截类型
*
* @param blacknumber
* : 号码
* @param mode
* : 更新的拦截类型 2017-10-23 上午9:36:43
*/
public boolean update(String blacknumber, int mode) {
SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(BlackNumberConstants.MODE, mode);
// values : 要更新的数据
// whereClause : 查询条件
// whereArgs : 查询条件的参数(具体的值)
int update = database.update(BlackNumberConstants.TABLE_NAME, values,
BlackNumberConstants.BLACKNUMBER + "=?",
new String[] { blacknumber });
System.out.println(update);
// 如果update是0标示更新失败
return update != 0;
}
// 查询单个数据
/**
* 根据黑名单号码查询拦截类型
*
* @param blackNumber
* @return 2017-10-23 上午9:41:39
*/ // 因为是根据黑名单号码查询拦截类型,一个黑名单号码对应的是一个拦截类型
public int queryMode(String blackNumber) {
int mode = -1;// 设置初始的默认值
SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();
// columns :设置查询哪一列的数据
// selection : 查询条件
// selectionArgs : 查询条件的参数
// groupBy : 分组
// having : 去重
// orderBy : 排序
Cursor cursor = database.query(BlackNumberConstants.TABLE_NAME,
new String[] { BlackNumberConstants.MODE },
BlackNumberConstants.BLACKNUMBER + "=?",
new String[] { blackNumber }, null, null, null);
if (cursor.moveToNext()) {
mode = cursor.getInt(0);
}
// 关闭
cursor.close();
database.close();
return mode;
}
// 查询全部数据
/**
* 查询全部数据的操作
*
* 2017-10-23 上午9:45:17
*/
public List<BlackNumberInfo> queryAll() {
SystemClock.sleep(2000);
List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();
SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();
Cursor cursor = database.query(BlackNumberConstants.TABLE_NAME,
new String[] { BlackNumberConstants.BLACKNUMBER,
BlackNumberConstants.MODE }, null, null, null, null,
"_id desc");// desc倒序查询,asc/默认不写:正序查询
while (cursor.moveToNext()) {
String blacknumber = cursor.getString(0);
int mode = cursor.getInt(1);
// 将黑名单号码和拦截类型保存到bean类中,方便后面使用
BlackNumberInfo blackNumberInfo = new BlackNumberInfo(blacknumber,
mode);
// 将bean类存放到集合中,方便listview显示
list.add(blackNumberInfo);
}
// 关闭数据库
cursor.close();
database.close();
return list;
}
/**
* 查询部分数据的操作
*
* 2017-10-23 上午9:50:27
*/
public List<BlackNumberInfo> queryPartAll(int maxNum, int startIndex) {
SystemClock.sleep(2000);
List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();
SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();
// 参数1:执行的sql语句
// 参数2:sql语句所需的参数
Cursor cursor = database
.rawQuery(
"select blacknumber,mode from info order by _id desc limit ? offset ?",
new String[] { maxNum + "", startIndex + "" });
while (cursor.moveToNext()) {
String blacknumber = cursor.getString(0);
int mode = cursor.getInt(1);
// 将黑名单号码和拦截类型保存到bean类中,方便后面使用
BlackNumberInfo blackNumberInfo = new BlackNumberInfo(blacknumber,
mode);
// 将bean类存放到集合中,方便listview显示
list.add(blackNumberInfo);
}
// 关闭数据库
cursor.close();
database.close();
return list;
}
}
关于上面代码,大家可能会有疑惑,什么时候需要database,什么时候不需要,后面本人上午查询了下,得到的答案是,如果是频繁打开关闭数据库会报错,所以在上面插入,删除什么的就没有关闭database,但是后面的查询所有,这种方法被调用的频率不会很高,间隔至少>1s,所以就关闭了database,最后那个方法是直接执行sql语句,其写法稍微与前面的不同。