android-数据库SQLite相关
2015-06-28 01:09
627 查看
android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句。
本文将介绍
android数据库的创建
利用sql语句对数据库增删改查
系统api数据库增删改查
数据库的事务
1,数据库的创建
步骤:
本文将介绍
android数据库的创建
利用sql语句对数据库增删改查
系统api数据库增删改查
数据库的事务
1,数据库的创建
步骤:
写一个类继承SQLiteOpenHelper
在构造函数中指定数据库名称,游标工厂,版本号
初始化数据库,执行getWritableDatabase或getReadableDatabase,创建或打开一个数据库.
onCreate里执行SQL创建语句
android平台下数据库的创建需要一个辅助类继承SQLiteOpenHelper,并且需要重写父类的构造方法。
/** *数据库创建辅助类写一个类继承SQLiteOpenHelper * *@authorwgk * */ publicclassPersonSQLiteOpenHelperextendsSQLiteOpenHelper{ publicPersonSQLiteOpenHelper(Contextcontext){ super(context,"PERSON.db",null,1);//此处是super,直接调用父类的构造方法 } /** * *构造方法,用于创建一个辅助类,用于打开/创建/管理一个数据库 * *@paramcontext *上下文 *@paramname *数据库文件的名字 *@paramfactory *游标工厂Cursor游标(指针),本身并不存储数据.保存数据库的引用. *@paramversion *数据库版本 */ publicPersonSQLiteOpenHelper(Contextcontext,Stringname, CursorFactoryfactory,intversion){ super(context,name,factory,version); } @Override //数据库第一次被创建时调用,适合初始化操作 publicvoidonCreate(SQLiteDatabasedb){ //创建表 db.execSQL("createtableperson(" +"_idintegerprimarykeyautoincrement," +"namevarchar(20),"+"ageinteger);"); } @Override //数据库更新时调用这个方法 //用于执行表的更新操作 publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ //TODOAuto-generatedmethodstub } }
这个类仅仅是一个辅助类,若想使用数据库,还需要创建一个数据库访问类PersonDAO。
2,对数据库进行增删改查
publicclassPersonDAO{ privatefinalContextcontext; privatePersonSQLiteOpenHelperhelper; publicPersonDAO(Contextcontext){ this.context=context; helper=newPersonSQLiteOpenHelper(context); } /** *@paramname *@paramage */ publicvoidadd(Stringname,intage){ SQLiteDatabasedb=helper.getWritableDatabase(); //db.execSQL("insertintoperson(name,age)values('"+name+"',"+age+")"); //防止SQL注入 db.execSQL("insertintoperson(name,values)values(?,?)", newObject[]{name,age}); } /** *根据名字删除一条数据 * *@paramname */ publicvoiddelete(Stringname){ SQLiteDatabasedb=helper.getWritableDatabase(); db.execSQL("deletefrompersonwherename=?",newObject[]{name}); } //根据名字更新年龄
publicvoidupdate(intage,Stringname){ SQLiteDatabasedb=helper.getWritableDatabase(); db.execSQL("updatepersonsetage=?wherename=?",newObject[]{age,name}); } publicvoidquerySingleRecord(StringnameStr){ SQLiteDatabasedb=helper.getReadableDatabase(); Cursorcursor=db.rawQuery("select*frompersonwherename=?",newString[]{nameStr}); if(cursor!=null&&cursor.moveToFirst()){ String_id=cursor.getString(0); Stringname=cursor.getString(1); Stringage=cursor.getString(2); System.out.println("_id:"+_id); System.out.println("name:"+name); System.out.println("age:"+age); cursor.close(); } } /** *查询所有数据 */ publicvoidqueryAll(){ SQLiteDatabasedb=helper.getReadableDatabase(); Cursorcursor=db.rawQuery("select*formperson",null); if(cursor!=null&&cursor.getCount()>0){ while(cursor.moveToNext()){ int_id=cursor.getInt(cursor.getColumnIndex("_id")); Stringname=cursor.getString(cursor.getColumnIndex("name")); intage=cursor.getInt(cursor.getColumnIndex("age")); System.out.println("_id:"+_id); System.out.println("name:"+name); System.out.println("age:"+age); System.out.println("-----------------"); } cursor.close(); } } }
注意:在获得数据库辅助类对象时,此时并未创建数据库,只有在辅助类对象调用getxxxxDatabase方法(创建可读或者可写的数据库)时,才创建数据库。
//此时并未创建数据可 PersonSQLiteOpenHelperhelper=newPersonSQLiteOpenHelper(getContext()); //获取一个可读/可写的数据库,真正创建了数据库 helper.getWritableDatabase();
3,使用goole的api操作数据库
除了使用SQL语句来进行增删改查,还可以使用google提供的api。
//主要语句
//增
db.insert("person","name",values);
//删
db.delete("person","name=?",newString[]{name});
//改
db.update("person",values,"name=?",newString[]{name});
//查
Cursorcursor=db.query("person",//表名
null,//要查询列名newString[]{name,age}
"name=?",//查询条件
newString[]{nameStr},//条件参数
null,//分组
null,//分组
null);//排序
使用google的api对PersonDAO进行修改,如下
/**
*使用google提供的api来操作数据库
*
*数据库访问对象
*@authorwgk
*
*/
publicclassPersonDAO3{
privatefinalContextcontext;
privatePersonSQLiteOpenHelperhelper;
publicPersonDAO3(Contextcontext){
this.context=context;
helper=newPersonSQLiteOpenHelper(context);
}
/**
*增加一条数据
*@paramname
*@paramage
*/
publicvoidadd(Stringname,intage){
SQLiteDatabasedb=helper.getWritableDatabase();
ContentValuesvalues=newContentValues();
values.put("name",name);
values.put("age",age);
//若需要插入一条空的数据,需要指定任意一个列的名称,以避免异常
StringnullColumnHack="null";
longinsert=db.insert("person",nullColumnHack,values);
System.out.println(insert);
}
/**
*删除一条数据根据名字
*@paramname
*/
publicvoiddelete(Stringname){
SQLiteDatabasedb=helper.getWritableDatabase();
intdelete=db.delete("person","name=?",newString[]{name});
System.out.println(delete);
}
/**
*更新年龄!根据名字
*@paramage
*@paramname
*/
publicvoidupdate(intage,Stringname){
SQLiteDatabasedb=helper.getWritableDatabase();
ContentValuesvalues=newContentValues();
values.put("age",age);
intupdate=db.update("person",values,"name=?",newString[]{name});
System.out.println(update);
}
/**
*查!根据一个人的名字
*@paramname
*/
publicvoidquerySingleRecord(StringnameStr){
SQLiteDatabasedb=helper.getReadableDatabase();
Cursorcursor=db.query("person",
null,//列名
"name=?",//查询条件
newString[]{nameStr},//查询参数
null,//分组
null,//分组
null);//排序
if(cursor!=null&&cursor.moveToFirst()){
String_id=cursor.getString(0);
Stringname=cursor.getString(1);
Stringage=cursor.getString(2);
System.out.println("_id:"+_id);
System.out.println("name:"+name);
System.out.println("age:"+age);
//关闭cursor
//关闭cursor
//关闭cursor
cursor.close();
}
}
/**
*查询所有数据
*/
publicvoidqueryAll(){
SQLiteDatabasedb=helper.getReadableDatabase();
Cursorcursor=db.query("person",
null,
null,
null,
null,
null,
"_idDESC");//排序
if(cursor!=null&&cursor.getCount()>0){
while(cursor.moveToNext()){
int_id=cursor.getInt(cursor.getColumnIndex("_id"));
Stringname=cursor.getString(cursor.getColumnIndex("name"));
intage=cursor.getInt(cursor.getColumnIndex("age"));
System.out.println("_id:"+_id);
System.out.println("name:"+name);
System.out.println("age:"+age);
}
//关闭cursor
//关闭cursor
//关闭cursor
cursor.close();
}
}
}
两种方式的比较
1.利用SQL语句进行增删改查优点:灵活,根据需要进行表的级联查询.
缺点:容易出错.没有返回值
2.利用系统API增删改查
优点:不容易出错.有返回值
缺点:不灵活,效率稍低,拼接sql语句耗时
-------------------------------------------------我是分割线-------------------------------------------------
数据库的事务(Transaction)
(安全性)银行转账:
转出,laowang账户10000->转出1000->
转入,xiaosan账户0收到1000
(高效性)数据的插入:
提高数据库操作效率,大约提升6倍速度
打开一次数据,
以laowang给xiaosan转账1000的例子写一段demo如下