一、建立 SQLite数据库的方法
1、定义一个数据库帮助类 SQLiteOpenHelper 的子类,定义静态数据库变量名称和静态数据库版本
//数据库名称
private static String dataBaseName="myDb.db";
//数据库版本(若开始版本比较小,后来的版本变大,则该类对象只会执行onUpgrade方法)
private static int dataBaseVersion=2;
2、通过构造方法传递上下文
//构造函数传递上下文
public OpenHelper(Context context)
{
super(context,dataBaseName, null, dataBaseVersion);
}
3、复写该子类的onCreate()方法,主要用于建表操作
public void onCreate(SQLiteDatabase db) {
//建表语句(主要是基本类型,)
String sql="create table student(stud_id integer primary key autoincrement,stud_name varchar(64) not null)";
//执行该建表语句
db.execSQL(sql);
}
4、复写该子类的onUpgrade更新方法(若是子类的数据库版本大于当前版本号直接执行该方法)
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
//更新表(alter table)加属性值
String sql="alter table student add sex varchar(8)";
db.execSQL(sql);
}
二、数据库的增加删除更新,查询操作
先定义一个数据库操作的接口,SQL语句中的占位符用Object[]Object[] params代替。Add,delete,update用这个作为方法的参数。查询用String[] selectinArgs作为参数,单条记录传入参数即可,多条记录可以为空。
数据库操作的接口类:
public boolean addStudent(Object[] params );
public boolean deleteStudent(Object[]params);
public boolean updateStudent(Object[] params);
public Map<String,String> viewStudent(String[] selectionArgs);
public List<Map<String,String>>listStudentMaps(String[] selectionArgs);
其具体实现类的命名规范是类名加Dao
获得自定义的一个数据库工具类的子类,用于创建数据库和获得数据库
private OpenHelper helper=null;//数据库助手类用于创建数据库(当调用getWritableDatabase()或getReadableDatabase()则创建数据库)
public StudentDao(Context context)
{
//上下文传递即是创建当前应用可用的数据库工具类
helper=new OpenHelper(context);
}
注意:为了能使该应用能使用该数据库,其他应用不能使用,尽可能的在构造方法处传入上下文对象。
1、数据库的增加
1.1定义一个数据库工具类对象用于获得数据库。
//定义一个SQLiteDatabase 数据库对象
SQLiteDatabase dataBase=null;
//获取数据库对象
dataBase=helper.getWritableDatabase();
1.2定义数据库执行的SQL语句
//插入的SQL语句
String sql="insert into student(stud_name,sex) values(?,?)";
//执行SQL语句
dataBase.execSQL(sql, params);
1.3执行数据库的SQL语句,其中dataBase.execSQL(sql, params);有两个参数的该方法的第二个参数是用来代替SQL语句中的占位符?的。该参数一般由方法参数传入。
1.4关闭数据库
dataBase.close();
//
public boolean addStudent(Object[] params) {
boolean flag=false;
//定义一个SQLiteDatabase 数据库对象
SQLiteDatabase dataBase=null;
try{
//获取数据库对象
dataBase=helper.getWritableDatabase();
//插入的SQL语句
String sql="insert into student(stud_name,sex) values(?,?)";
//执行SQL语句
dataBase.execSQL(sql, params);
flag=true;
}catch(Exception e)
{
}finally{
//关闭数据库
if(dataBase!=null)
{
dataBase.close();
}
}
return flag;
}
//
2、数据库的删除
String sql="delete from student where stud_id=?";
dataBase.execSQL(sql, params);
public boolean deleteStudent(Object[] params) {
boolean flag=false;
SQLiteDatabase dataBase=null;
try{
dataBase=helper.getWritableDatabase();
String sql="delete from student where stud_id=?";
dataBase.execSQL(sql, params);
flag=true;
}catch(Exception e){
}finally{
if(dataBase!=null)
{
dataBase.close();
}
}
return flag;
}
3、数据库的修改更新
//SQLiteDatabase 数据库的SQL语句
String sql="update student set stud_name=?,sex=? where stud_id=?";
public boolean updateStudent(Object[] params) {
boolean flag=false;
//定义数据库
SQLiteDatabase dataBase=null;
try{
//获得数据库
dataBase=helper.getWritableDatabase();
//SQLiteDatabase 数据库的SQL语句
String sql="update student set stud_name=?,sex=? where stud_id=?";
dataBase.execSQL(sql, params);
flag=true;
}catch(Exception e)
{
Log.i("<<<<<<","更新修改数据库信息错误");
}finally{
//关闭数据库
if(dataBase!=null)
{
dataBase.close();
}
}
return flag;
}
///
对于数据库的增删改只要执行数据库的execSQL(sql, params)方法即可。并通过自定义方法的参数Object[] params传入该方法代替params(即是SQL语句的占位符)且参数都用双引号。
4、数据库的查询
获得数据库,获得游标,获得列数,遍历查询(获得列名,获得列名对应的数据)
4.1单条记录查询
public Map<String, String> viewStudent(String[] selectionArgs) {
//定义存储查询结果的集合及用于查询操作的SQLiteDatabase数据库
Map<String,String> map=new HashMap<String,String>();
SQLiteDatabase dataBase=null;
try{
//获得数据库
dataBase=helper.getReadableDatabase();
//sql执行语句
String sql="select *from student where stud_id=?";
//获得查询游标
Cursor cursor=dataBase.rawQuery(sql, selectionArgs);
//获得数据库的列个数
int colums=cursor.getColumnCount();
while(cursor.moveToNext())
{//遍历每一列
for(int i=0;i<colums;i++)
{
//获得列名
String colsName=cursor.getColumnName(i);
//获得列名对应的索引的游标的数据
String colsValue=cursor.getString(cursor.getColumnIndex(colsName));
//数据库的某些属性可以为空
if(colsValue==null)
{
colsValue=" ";
}
//按列名,数据对放入集合HashMap中
map.put(colsName, colsValue);
}
}
}catch(Exception e)
{
Log.i("<<<<<<viewStuent","数据库单条查询失败!!!");
}finally{
if(dataBase!=null)
{
dataBase.close();
}
}
return map;
}
4.2多条记录查询
public List<Map<String, String>> listStudentMaps(String[] selectionArgs) {
//多条记录定义一个集合嵌套来保存
List<Map<String,String>> list=new ArrayList<Map<String,String>>();
//定义一个数据库
SQLiteDatabase dataBase=null;
try{
dataBase=helper.getReadableDatabase();
String sql="select * from student";
//获得查询游标
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 colsName=cursor.getColumnName(i);
//获得该列名对应的数据
String colsValue=cursor.getString(cursor.getColumnIndex(colsName));
//判断是否有记录的属性值是否为空,为空则用空格代替
if(colsValue==null)
{
colsValue=" ";
}
map.put(colsName, colsValue);
}
list.add(map);
}
}catch(Exception e){
Log.i("数据库查询listStudentMaps", "数据库多条记录查询失败!!!");
}
return list;
}
测试类:
public class Test extends AndroidTestCase {
public void testCreateDb()
{
OpenHelper helper=new OpenHelper(getContext());
helper.getWritableDatabase();
}
public void testInsertDB()
{
StudentService stuDao=new StudentDao(getContext());
Object[] params={"李华","男"};
boolean flag =stuDao.addStudent(params);
Log.i("<<<<<<<<<<<<","zzzzzz插入数据"+flag);
}
public void testDeleteDB()
{
StudentService stuDao=new StudentDao(getContext());
Object[] params={1};
boolean flag =stuDao.deleteStudent(params);
Log.i("<<<<<<<<<<<<","zzzzzzzzzzzz11111111111"+flag);
}
public void testUpdataStudent()
{
StudentService stuDao=new StudentDao(getContext());
Object[] params={"程序猿","男","3"};
boolean flag=stuDao.updateStudent(params);
Log.i("<<<<<update<<<<<","<<<<<<<<<<<<<<"+flag);
}
//单条记录
public void testViewStudent()
{
StudentService stuDao=new StudentDao(getContext());
String[] selectionArgs={"3"};
Map<String,String> map=stuDao.viewStudent(selectionArgs);
Log.i("单条记录查询测试<<<<<<", map.toString());
}
public void testListStudent()
{
StudentService stuDao=new StudentDao(getContext());
//String[] selectionArgs={"3"};
List<Map<String,String>> list= stuDao.listStudentMaps(null);
Log.i("多条条记录查询测试<<<<<<", list.toString());
}
}
///
利用封装好的方法操作数据库
抽象接口
public interface StudentService2 {
public boolean addStudent(Object[] params );
public boolean deleteStudent(String whereClause, String[] whereArgs);
public boolean updateStudent( ContentValues values, String whereClause, String[] whereArgs);
public Map<String,String> viewStudent(String selection ,String[] selectionArgs);
public List<Map<String,String>>listStudentMaps(String selection,String[] selectionArgs);
}
接口实现
public class StudentDao2 implements StudentService2 {
private OpenHelper helper=null;
public StudentDao2(Context context) {
helper=new OpenHelper(context);
}
@Override
public boolean addStudent(Object[] params) {
boolean flag=false;
//获得数据库
SQLiteDatabase database=null;
try{
database=helper.getWritableDatabase();
//类似集合Map
ContentValues values=new ContentValues();
values.put("stud_name", "湖南");
values.put("sex", "男");
database.insert("student",null, values);
}catch(Exception e){
Log.i("insert方法测试<<<<<<","插入数据失败!!!");
}finally{
if(database!=null)
{
database.close();
}
}
return flag;
}
@Override
public boolean deleteStudent(String whereClause, String[] whereArgs) {
boolean flag=false;
//获得数据库
SQLiteDatabase database=null;
int i=0;
try{
database=helper.getWritableDatabase();
i=database.delete("student", whereClause, whereArgs);
Log.i("删除数据","返回值"+i);//返回值为1
flag=(i>0?true:false);
}catch(Exception e){
Log.i("数据库删除操作","删除错误!!!");
}finally{
if(database!=null)
{
database.close();
}
}
return flag;
}
@Override
public boolean updateStudent( ContentValues values, String whereClause, String[] whereArgs) {
boolean flag=false;
int i=0;
//获得SQLiteDatabase数据库
SQLiteDatabase database=null;
try{
database=helper.getWritableDatabase();
i=database.update("student", values, whereClause, whereArgs);
flag=(i>0?true:false);
}catch(Exception e){
}finally{
if(database!=null)
{
database.close();
}
}
return flag;
}
@Override
public Map<String, String> viewStudent(String selection, String[] selectionArgs) {
//String selection过滤条件不包含where,
//String[] selectionArgs过滤条件对应的值
SQLiteDatabase database=null;
Map<String, String> map=new HashMap<String, String>();
Cursor cursor=null;
try{
database=helper.getReadableDatabase();
cursor=database.query(true, "student", null, selection, selectionArgs, null,null, null, null);
int colums=cursor.getColumnCount();
while(cursor.moveToNext())
{
for(int i=0;i<colums;i++)
{
String colsName=cursor.getColumnName(i);
String colsValue=cursor.getString(cursor.getColumnIndex(colsName));
if(colsValue==null)
{
colsValue=" ";
}
map.put(colsName,colsValue);
}
}
}catch(Exception e){
Log.i("查询<<<<<<", "查询失败!!!");
}
return map;
}
@Override
public List<Map<String, String>> listStudentMaps(String selection,String[] selectionArgs) {
List<Map<String, String>> list=new ArrayList<Map<String, String>>();
Cursor cursor=null;
SQLiteDatabase database=null;
try{
//获得数据库
database=helper.getReadableDatabase();
cursor=database.query("student", null, selection, selectionArgs, null, null, null, null);
int columns=cursor.getColumnCount();
while(cursor.moveToNext())
{
Map<String,String> map=new HashMap<String,String>();
for(int i=0;i<columns;i++)
{
String columnName=cursor.getColumnName(i);
String columnValue=cursor.getString(cursor.getColumnIndex(columnName));
if(columnValue==null)
{
columnValue=" ";
}
map.put(columnName, columnValue);
}
list.add(map);
}
}catch(Exception e){
Log.i("数据库查询2","查询失败!!!");
}finally{
if(database!=null)
{
database.close();
}
}
return list;
}
}
测试:
public class Test2 extends AndroidTestCase {
public void testInsert()
{
StudentService2 service=new StudentDao2(getContext());
boolean flag=service.addStudent(null);
Log.i("插入数据成功","<<<<<<<<<<<<<<<<<<<<<<"+flag);
}
public void testDelete()
{
StudentService2 service=new StudentDao2(getContext());
String whereClause="stud_id=?";//过滤条件
String []whereArgs={"11"};//过滤条件对应的值
boolean flag=service.deleteStudent(whereClause, whereArgs);
Log.i("删除数据成功","<<<<<<<<<<<<<<<<<<<<<<<<<<"+flag);
}
public void testUpdate()
{
StudentService2 service=new StudentDao2(getContext());
ContentValues values=new ContentValues();
values.put("stud_name", "益阳");
values.put("sex", "女");//与属性是对应的不能写成stud_sex
//不包含where关键字
String whereClause="stud_id=?";
String[] whereArgs={"8"};
boolean flag=service.updateStudent(values, whereClause, whereArgs);
Log.i("更新数据","<<<<<<<<<<"+flag );
}
public void testViewStudent()
{
StudentService2 service=new StudentDao2(getContext());
Map<String,String>map=null;
map=service.viewStudent("stud_id=?",new String[]{"8"});
Log.i("单条记录查询",map.toString());
}
public void testListStudentMaps()
{
StudentService2 service=new StudentDao2(getContext());
List<Map<String,String>>list=null;
list=service.listStudentMaps(null,null);
Log.i("多条记录查询",list.toString());
}
}