您的位置:首页 > 移动开发 > Android开发

android-数据库SQLite相关

2015-06-28 01:09 627 查看
android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句。

本文将介绍

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如下




publicclassTransactionDemoextendsAndroidTestCase{

publicvoidtransactionDemo(){

PersonSQLiteOpenHelperhelper=newPersonSQLiteOpenHelper(getContext());
//此时才真正创建数据库
SQLiteDatabasedb=helper.getWritableDatabase();
try{
//开始事务
db.beginTransaction();

//转出1000
db.execSQL("updatepersonsetmoney=money-1000wherename=?",newObject[]{"laowang"});

//在执行至回滚点之前,并不会对数据库进行真的操作,一切都在内存中进行,只有执行到回滚点之后,才会影响到数据库
//inti=1/0;
//转入1000
db.execSQL("updatepersonsetmoney=money+1000wherename=?",newObject[]{"xiaosan"});
//设置回滚点
db.setTransactionSuccessful();
}catch(Exceptione){
e.printStackTrace();
}finally{
db.endTransaction();

}
}




总结:

-------------------------------------------------基础要像磐石!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航