Android开发之数据存储与访问(3)-SQLite数据库

直接上代码!

 

JavaBean

public class Person {
	String name;
	String number;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
}
 

数据库

public class MyDBOpenHelper extends SQLiteOpenHelper {
	/**
	 * @param context 应用程序上下文
	 * @param name    数据库的名字
	 * @param factory 查询数据库的游标工厂 一般情况下用sdk默认的
	 * @param version  数据库的版本 版本号必须不小于1 
	 */
	public MyDBOpenHelper(Context context) {
		super(context, "demo.db", null, 1);
	}

	// 在mydbOpenHelper在数据库第一次被创建的时候会执行onCreate();
	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("onCreate");
		db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
	}
    //用于升级软件时更新数据库表结构。如果数据库的版本号发生改变就会执行
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("onUpdate ");
		db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");
	}
}

 

DAO

public class PersonDao {
	private static final String TAG = "PersonDao";
	private MyDBOpenHelper dbOpenHelper;

	// 在personDao被new出来的时候 就完成初始化
	public PersonDao(Context context) {
		dbOpenHelper = new MyDBOpenHelper(context);
	}

	// 增删改查
	//查询的时候调用的方法:db.rawQuery()
	//增删改调用的方法:db.execSQL()

	/**
	 * 往数据库添加一条数据
	 */
	public void add(String name, String phone) {
		boolean result = find(name);
		if (result)
			return;

		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			db.execSQL("insert into person (name,phone) values (?,?)",
					new Object[] { name, phone });
			// 关闭数据库 释放数据库的链接
			db.close();
		}
	}

	/**
	 * 查找数据库的操作
	 */
	public boolean find(String name) {
		boolean result = false;
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		if (db.isOpen()) {
			Cursor cursor = db.rawQuery("select * from person where name=?",
					new String[] { name });
			if (cursor.moveToFirst()) {
				int index = cursor.getColumnIndex("phone"); // 得到phone在表中是第几列
				String phone = cursor.getString(index);
				Log.i(TAG, "phone =" + phone);
				result = true;

			}
			// 记得关闭掉 cursor
			cursor.close();
			result = false;
			// 释放数据库的链接
			db.close();
		}
		return result;
	}

	/**
	 * 删除一条记录
	 * 
	 * @param name
	 */
	public void delete(String name) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			db.execSQL("delete from person where name =?",
					new Object[] { name });
			db.close();
		}
	}

	/**
	 * 更新一条记录
	 * 
	 */
	public void update(String name, String newname, String newphone) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		if (db.isOpen()) {
			db.execSQL("update person set name=? , phone=? where name=?",
					new Object[] { newname, newphone, name });
			db.close();
		}
	}

	/**
	 * 查找全部
	 */
	public List
   
   
    
     getAllPersons() {
		List
    
    
     
      persons=null;
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		if (db.isOpen()) {
			persons = new ArrayList
     
     
      
      ();
			Cursor cursor = db.rawQuery("select * from person ", null);
			while (cursor.moveToNext()) {
				Person person = new Person();
				int nameindex = cursor.getColumnIndex("name");
				int phoneindex = cursor.getColumnIndex("phone");
				String name = cursor.getString(nameindex);
				String phone = cursor.getString(phoneindex);
				person.setName(name);
				person.setNumber(phone);
				persons.add(person);
			}
			cursor.close();
			db.close();
		}
		return persons;
	}

}

     
     
    
    
   
   

 

测试类

public class TestPersonDao extends AndroidTestCase {
	public void testAdd() throws Exception{
		PersonDao dao = new PersonDao(getContext());
		for(int i=0;i<100;i++){
		dao.add("lisi"+i, "123456789"+i);
		}
	}
	public void testdelete() throws Exception{
		PersonDao dao = new PersonDao(getContext());
		dao.delete("lisi99");
	}
	public void testupdate() throws Exception{
		PersonDao dao = new PersonDao(getContext());
		dao.update("lisi98", "wangwu", "119");
	}
	
	public void testFindAll() throws Exception{
		PersonDao dao = new PersonDao(getContext());
		List
   
   
    
      persons  = dao.getAllPersons();
		assertEquals(100, persons.size());
	}
 }

   
   

 

SQLite数据库详解:

        在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。SQLite可以解析大部分标准SQL语句。 另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段的类型信息:
       CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

       我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。

       为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值