安卓存储数据和文件系列3:SQLite数据库方式

在android手机中使用SQLite数据库方式进行数据的存储,是一种常见的使用方式,可以存放文件,是以文件或内容的形式保存在android手机上的,访问的时候不能跨应用。其中对数据库进行增删改查有两种方式,一种是sql语句的方法,一种是使用系统自带的辅助方式,这两种方式达到的效果的相同的,因个人的喜好进行选择。

整体思路:首先创建一个继承SQLiteOpenHelper的DbOpenHelper类,在这个类中声明数据库的名字和版本,在类中的onCreate方法中写创建表的语句,以·完成对数据库中表的创建,在onUpgrade方法中,是用于对数据库进行升级的,如执行一些sql语句用于做一些删除表、添加表、添加一些字段或升级的事情,这方法当数据库的版本发生变化的时候调用,而当版本发生变化的时候,不调用onCreate方法,而只调用onUpgrade方法。定义一个PersonService接口,在这个接口中定义增加、删除、修改、查询单条、查询所有的操作的方法,然后创建一个PersonDao类,实现这个PersonService接口,并重写里面的各个方法。最后创建一个继承AndroidTestCase的单元测试类MyTest,在这个类中,定义createDb方法,用于实例化DbOpenHelper这个类,并创建这个数据库中的表,定义insertDb方法、deleteDb方法、updateDb方法、viewDb方法、listDb方法,分别完成增加、删除、修改、查询单条、查询所有的操作。注意:在清单文件AndroidManifest.xml中注册单元测试。两种使用方式的本质不同是操作数据的方式不同,前者使用写sql语句的形式进行对数据库的操作,后者使用调用系统中已经封装好的增删改查的方式对数据库进行操作,由于这样的不同也会导致其他类的写法略有不同,但是DbOpenHelper类的写法是完全相同的。

DbOpenHelper.java文件:

public class DbOpenHelper extends SQLiteOpenHelper {

	private static String name="mydb.db";//表示数据库的名称
	private static int version=2;//表示数据库的版本号码   由1改为2
	public DbOpenHelper(Context context) {
		super(context, name, null, version);
		// TODO Auto-generated constructor stub
	}

//	当数据库被创建的时候第一次执行,完成对数据库的表的创建
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
//	       支持的数据类型:整型数据、字符串类型、日期类型、二进制的数据类型
       String sql="create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
       db.execSQL(sql);//完成数据库的创建
	}

//	数据库的升级,如某些字段太短了,存储不了那么多的内容或者缺少某些字段,我们可以完成对数据库的升级,而不会损害原来的数据
//	删除表、添加表或者做一些升级的事情
//	使用ALTER TABLE,添加一列,或者对列进行重命名
//	最后两个参数是两个版本号吗:新的版本要比老的版本号码大
//	如果把版本从1改为2的话,不会执行onCreate方法,而是执行onUpgrade方法
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
        String sql="alter table person add sex varchar(8)";
        db.execSQL(sql);//使用这个方法来执行sql语句
	}

}

PersonService.java文件:

public interface PersonService {

//	分别为:增加、删除、修改、查询单条、查询所有的操作     第一种方式
	
	public boolean addPerson(Object[] parmas);
	
	public boolean deletePerson(Object[] parmas);
	
	public boolean updatePerson(Object[] parmas);
	
	public Map<String, String> viewPerson(String[] selectionArgs);
	
	public List<Map<String, String>> listPerson(String[] selectionArgs);
	
	
}
PersonService2.java文件:

public interface PersonService2 {

//	分别为:增加、删除、修改、查询单条、查询所有的操作     第二种方式
	
	public boolean addPerson(ContentValues values);
	
	public boolean deletePerson(String whereClause,String[] whereArgs);
	
	public boolean updatePerson(ContentValues values,String whereClause,String[] whereArgs);
	
	public Map<String, String> viewPerson(String selection,String[] selectionArgs);
	
	public List<Map<String, String>> listPerson(String selection,String[] selectionArgs);
	
	
}

PersonDao.java文件:

//实现PersonService接口,完成以下分别为:增加、删除、修改、查询单条、查询所有的功能     第一种方式
public class PersonDao implements PersonService {

	private DbOpenHelper helper=null;
	public PersonDao(Context context){
		helper=new DbOpenHelper(context);
	}
	@Override
	public boolean addPerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="insert into person(name,address,sex) values (?,?,?)";
			database=helper.getWritableDatabase();//实现对数据库的写入的操作
			database.execSQL(sql,parmas);
			flag=true;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean deletePerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="delete from person where id = ?";
			database=helper.getWritableDatabase();
			database.execSQL(sql,parmas);
			flag=true;
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean updatePerson(Object[] parmas) {
		// TODO Auto-generated method stub
		boolean flag=false;
		SQLiteDatabase database=null;
		try {
			String sql="update person set name= ?,address= ?,sex= ? where id= ? ";
			database=helper.getWritableDatabase();
			database.execSQL(sql, parmas);
			flag=true;
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public Map<String, String> viewPerson(String[] selectionArgs) {
		// TODO Auto-generated method stub
		Map<String,String> map=new HashMap<String, String>();
		SQLiteDatabase database=null;
		try {
			String sql="select * from person where id = ?";
			database=helper.getReadableDatabase();//执行读数据库的操作
			Cursor cursor=database.rawQuery(sql, selectionArgs);//执行行(hang)查询的操作,返回一个游标
//			获得数据库列的个数
			int colums=cursor.getColumnCount();
			while (cursor.moveToNext()) {//如果有下一个位置的话
				for (int i = 0; i < colums; i++) {
					String cols_name=cursor.getColumnName(i);
					String cols_value=cursor.getString(cursor.getColumnIndex(cols_name));
					if(cols_value==null){
						cols_value="";
					}
					map.put(cols_name, cols_value);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return map;
	}

	@Override
	public List<Map<String, String>> listPerson(String[] selectionArgs) {
		// TODO Auto-generated method stub
		List<Map<String, String>> list=new ArrayList<Map<String,String>>();
		SQLiteDatabase database=null;
		try {
			String sql="select * from person";
			database=helper.getReadableDatabase();
			Cursor cursor=database.rawQuery(sql, selectionArgs);//返回一个游标
			int colums=cursor.getColumnCount();//获取列的长度
			while (cursor.moveToNext()) {//循环遍历这个游标
				Map<String, String> map=new HashMap<String, String>();
				for (int i = 0; i < colums; i++) {
					String cols_name=cursor.getColumnName(i);
					String cols_value=cursor.getString(cursor.getColumnIndex(cols_name));
					if(cols_value==null){
						cols_value="";
					}
					map.put(cols_name, cols_value);
				}
				list.add(map);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return list;
	}

}
PersonDao2.java文件:

public class PersonDao2 implements PersonService2 {

	private DbOpenHelper helper = null;

	public PersonDao2(Context context) {
		helper = new DbOpenHelper(context);
	}

	@Override
	public boolean addPerson(ContentValues values) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		long id = -1;
		try {
			database = helper.getWritableDatabase();
			id = database.insert("person", null, values);// 返回一个long类型的变量
			flag = (id != -1 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean deletePerson(String whereClause, String[] whereArgs) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		int count = 0;
		try {
			database = helper.getWritableDatabase();
			count = database.delete("person", whereClause, whereArgs);// 返回影响的行数
			flag = (count > 0 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean updatePerson(ContentValues values, String whereClause,
			String[] whereArgs) {
		// TODO Auto-generated method stub
		boolean flag = false;
		SQLiteDatabase database = null;
		int count = 0;
		try {
			database = helper.getWritableDatabase();
			count = database.update("person", values, whereClause, whereArgs);// 返回影响的行数
			flag = (count > 0 ? true : false);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return flag;
	}

	@Override
	public Map<String, String> viewPerson(String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		// select 返回的列名称(投影查询) from
		SQLiteDatabase database = null;
		Cursor cursor = null;
		Map<String, String> map = new HashMap<String, String>();
		try {
			database = helper.getReadableDatabase();
			// 第一个参数为true,表示返回的结果是唯一的(查询的是单条记录),第二个参数是表名,第三个参数为null,表示查询所有的列值,
			cursor = database.query(true, "person", null, selection,
					selectionArgs, null, null, null, null);// 返回的结果是一个游标
			int cols_len = cursor.getColumnCount();
			while (cursor.moveToNext()) {
				for (int i = 0; i < cols_len; i++) {
					String cols_name = cursor.getColumnName(i);
					String cols_value = cursor.getString(cursor
							.getColumnIndex(cols_name));
					if (cols_value == null) {
						cols_value = "";
					}
					map.put(cols_name, cols_value);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return map;
	}

	@Override
	public List<Map<String, String>> listPerson(String selection,String[] selectionArgs) {
		// TODO Auto-generated method stub
		SQLiteDatabase database = null;
		Cursor cursor = null;
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		try {
			database = helper.getReadableDatabase();
//			第一个参数为false,表示查询的为多条记录,
			cursor=database.query(false, "person", null, selection, selectionArgs,
					null, null, null, null);
			int cols_len = cursor.getColumnCount();
			while (cursor.moveToNext()) {
				Map<String, String> map=new HashMap<String, String>();
				for (int i = 0; i < cols_len; i++) {
					String cols_name = cursor.getColumnName(i);
					String cols_value = cursor.getString(cursor
							.getColumnIndex(cols_name));
					if (cols_value == null) {
						cols_value = "";
					}
					map.put(cols_name, cols_value);
				}
				list.add(map);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (database != null) {
				database.close();
			}
		}
		return list;
	}
}
MyTest.java文件:

//测试创建数据库并进行增加、删除、修改、查询单条、查询所有的第一种方式的测试单元,直接在方法名上右键运行测试该方法,
//一个方法一个方法的测试
public class MyTest extends AndroidTestCase {

	public MyTest() {
		// TODO Auto-generated constructor stub
	}
	
	public void createDb(){
		DbOpenHelper helper=new DbOpenHelper(getContext());
		helper.getWritableDatabase();//只有调用这个方法的时候才真的创建了数据库
	}
	
	public void insertDb(){
		PersonService service=new PersonDao(getContext());
//		Object[] parmas={"张三","北京","男"};
		Object[] parmas={"李四","上海","女"};
		boolean flag=service.addPerson(parmas);
		System.out.println("-->"+flag);
	}
	
	public void deleteDb(){
		PersonService service=new PersonDao(getContext());
		Object[] parmas={1};
		boolean flag=service.deletePerson(parmas);
		System.out.println("-->"+flag);
	}
	
	public void updateDb(){
		PersonService service=new PersonDao(getContext());
		Object[] parmas={"王五","曼谷","人妖","3"};
		service.updatePerson(parmas);
	}
	
	public void viewDb(){
		PersonService service=new PersonDao(getContext());
		String[] selectionArgs={"3"};
		Map<String, String> map = service.viewPerson(selectionArgs);
		Log.i("MyTest", "-->"+map.toString());
	}
	
	public void listDb(){
		PersonService service=new PersonDao(getContext());
		List<Map<String, String>> list = service.listPerson(null);//查询所有记录,不需要传参数
		Log.i("MyTest", "-->"+list.toString());
	}


}
MyTest2.java文件:
//测试创建数据库并进行增加、删除、修改、查询单条、查询所有的第二种方式的测试单元,直接在方法名上右键运行测试该方法,
//一个方法一个方法的测试
public class MyTest2 extends AndroidTestCase {

	public MyTest2() {
		// TODO Auto-generated constructor stub
	}

	public void addPerson(){
		PersonService2 service2=new PersonDao2(getContext());
		ContentValues values=new ContentValues();//类似map的属性
		values.put("name", "杰克");
		values.put("address", "天津");
		values.put("sex", "男");
		boolean flag=service2.addPerson(values);
		System.out.println("-->>"+flag);//输出返回的结果
	}
	
	public void deletePerson(){
		PersonService2 service2=new PersonDao2(getContext());
//		标准的sql语句的写法:delete from person where id=?  注意:写下面这句代码的时候不包含where关键字
		boolean flag=service2.deletePerson("id = ?", new String[]{"4"});
		System.out.println("-->>"+flag);//输出返回的结果
	}
	
	public void updatePerson(){
		PersonService2 service2=new PersonDao2(getContext());
		ContentValues values=new ContentValues();//类似map的属性
		values.put("name", "小罗志祥");
		values.put("address", "台湾");
		values.put("sex", "女");
		boolean flag=service2.updatePerson(values, "id = ?", new String[]{"2"});
		System.out.println("-->>"+flag);//输出返回的结果
	}
	
	public void viewPerson(){
		PersonService2 service2=new PersonDao2(getContext());
		Map<String, String> map=service2.viewPerson(" id=? ", new String[]{"2"});
		System.out.println("-->>"+map.toString());//输出返回的结果
	}
	
	public void listPerson(){
		PersonService2 service2=new PersonDao2(getContext());
//		下面一句代码等同于select *from person
		List<Map<String, String>> list=service2.listPerson(null, null);
		System.out.println("-->>"+list.toString());//输出返回的结果
	}
	
}
AndroidManifest.xml文件:

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.android_db" >
    </instrumentation>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="android.test.runner"/>
        <activity
            android:name="com.example.android_db.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值