/**
* SQLiteOpenHelper为Android提供的管理数据库的工具类,管理数据库的创建和版本更新
* 一般用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate()和onUpgrade()
然后通过这个子类的对象的getWriteableDatabase和getReadableDatabase方法拿到SQLiteDatabase实例,就可以进行数据库的操作了,增删改查类函数包装如下。
多学一个Android中的测试代码的写法。
* SQLiteOpenHelper为Android提供的管理数据库的工具类,管理数据库的创建和版本更新
* 一般用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate()和onUpgrade()
*/
public class PersonHelper extends SQLiteOpenHelper {
/**
* 数据库的构造方法,用来定义数据库的名称,数据库查询的结果集和数据库的版本
*/
public PersonHelper(Context context) {
//第三个参数为factory,用来创建cursor对象,null使用默认
//第四个参数version版本,最小为1
super(context, "person.db", null, 1);
}
/**
* 数据库第一次被创建时调用,创建表和初始化表
* varchar()指定数字乃是给程序员自己看的,因为在底层是以字符串存的,超过也没关系
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person (" +
"id integer primary key autoincrement, " +
"name varchar(20), " +
"number varchar(20));";
db.execSQL(sql);
}
/**
* 数据库版本更新时调用该方法,数据库的版本由程序员控制
* 构造SQLiteOpenHelper,传入version
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
然后通过这个子类的对象的getWriteableDatabase和getReadableDatabase方法拿到SQLiteDatabase实例,就可以进行数据库的操作了,增删改查类函数包装如下。
/**
* DAO data access object
* 专门用来操作数据库的类
*/
public class PersonDao {
private SQLiteOpenHelper helper;
/**
* 在构造方法里完成helper的初始化
*/
public PersonDao(Context context){
helper = new PersonHelper(context);
}
/**
* 添加一条记录到数据库
* Make sure to call close when you no longer need the database
* 为什么要调用close,数据库会默认保持打开状态,进入缓存,多次调用getWriteableDatabase
* 和getReadableDatabase会得到同一个Database对象
*/
public void add(String name, String number){
/**拿到数据库的梳理
* getWritableDatabase()以 写 的方式打开数据库对应的 SQLiteDatabase对象
* getReadableDatabase()以 读写 的方式打开数据库对应的 SQLiteDatabase对象
*/
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into person (name,number) values (?, ?)",
new Object[]{name, number});
db.close();
}
/**
* 查询记录是否存在
*/
public boolean find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
boolean res = cursor.moveToNext();
cursor.close();
db.close();
return res;
}
/**
* 修改特定条目的信息
*/
public void update(String name, String number){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set number=? where name=?",
new Object[]{number,name});
db.close();
}
/**
* 删除特定的条目
* @param name
*/
public void delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where name=?", new Object[]{name});
db.close();
}
public List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person", null);
List<Person> lists = new ArrayList<Person>();
while(cursor.moveToNext()){
Person person = new Person();
//要与查询顺序一一对应
person.setId(cursor.getInt(0));
person.setName(cursor.getString(1));
person.setNumber(cursor.getString(2));
//更保险的做法
/*
person.setId(cursor.getInt(cursor.getColumnIndex("id")));
person.setName(cursor.getString(cursor.getColumnIndex("name")));
person.setNumber(cursor.getString(cursor.getColumnIndex("number")));
*/
lists.add(person);
}
db.close();
return lists;
}
}
多学一个Android中的测试代码的写法。
1.专门写一个测试类,该类必须继承AndroidTestCase。
2.必须在AndroidManifest中添加权限,重新建一个Android Test Project,在该项目的AndroidManifest文件中拿到instrumentation标签和uses-library标签,放到同样位置。
测试代码如下:
public class TestDB extends AndroidTestCase{
public void testCreateDB()throws Exception{
//创建数据库,new后数据库并不被创建
PersonHelper ph = new PersonHelper(getContext());
//此时数据库被创建
ph.getWritableDatabase();
}
public void testAdd()throws Exception{
PersonDao pd = new PersonDao(getContext());
pd.add("Lisi", "123");
}
public void testFind()throws Exception{
PersonDao pd = new PersonDao(getContext());
boolean result = pd.find("Lisi");
assertEquals(true, result);
}
public void testUpdate()throws Exception{
PersonDao pd = new PersonDao(getContext());
pd.update("Lisi", "321");
}
public void testDelete()throws Exception{
PersonDao pd = new PersonDao(getContext());
pd.delete("Lisi");
}
public void testFindAll()throws Exception{
PersonDao pd = new PersonDao(getContext());
List<Person> persons = pd.findAll();
for(Person p: persons){
System.out.println(p.toString());
}
}
}