Android之SQLiteOpenHelper的使用

/**
 * 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());
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值