上次写了份不透彻的view层次的分析,总结自己的表述能力还是不行,这次讲解一个实际应用吧,按照步骤来就ok。哈哈~~~
Android中存数据的方法有很多,自己写文件啊,保存在data下什么的都是可以的。以以往的经验来看,自己如果要写一个查询啊,插入什么的就比较麻烦,所以借助数据库是个很好的选择。
注:这里的sdk版本是apilevel11到apilevel16。如果使用模拟器要使用高版本的哦。
如网上的教程一样,我们先写一个DBhelper的类,用来创建数据库test.db和一个名为person的数据表。这个类需要继承自android.database.sqlite.SQLiteOpenHelper(我给出完成的包名是提示你可以去看看相关的文档,不要只成功运行数据库就满足哦)。
下面附上代码,word处理代码真不好搞。。。。。。
public classDBhelper extends SQLiteOpenHelper {
//这里指定数据库的名称test.db
private static finalString DATABASE_NAME="test.db";
//这里指定数据库的版本,这两项都只相当于宏定义,不是指定了就完事了。
private static final int DATABASE_VERSION=1;
//构造函数,把context传给父类,让父类去解决吧,有继承关系就是如此happy
publicDBhelper(Context context){
//DATABASE_NAME数据库名字 DATABASE_VERSION数据库版本
//null是指的游标(就是像excel中鼠标指向的表格),传null吧。
//如果需要一些游标的功能,要自己看看sqlite权威说明还是叫什么来着的文档。
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
//重写onCreate方法。必写!
public voidonCreate(SQLiteDatabase arg0) {
// TODOAuto-generated method stub
/*这里解释下这句话的含义:如果不存在person的表格则创建一个名为person的表格,
*
* _id是自动增加的,name是字符型的,arg是整数型的,info是文字型的
* 这四行就可以当作一个表格中的列,四列,对应每个个体的四个属性,是这么解释吧,哈哈
* 然后没增加一个个体,则行就增加一列,但是属性是不改变的 */
arg0.execSQL("CREATETABLE IF NOT EXISTS person"+
"(_idINTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR,arg INTEGER,info TEXT)");
}
@Override
public voidonUpgrade(SQLiteDatabase db, intoldVersion,intnewVersion) {
// TODOAuto-generated method stub
//这个我也没用过,大概是增加个体的属性的时候使用吧,这个时候记得要升级版本号~~~~~~
db.execSQL("ALTERTABLE person ADD COLUMN other STRING");
}
}
public classDBManager {
//当然是先获得一个dbhelper的指针啦。
privateDBhelperhelper;
//得到一个数据库的指针
privateSQLiteDatabasedb;
//构造函数
publicDBManager(Context context){
//实例化dbhelper,就创建一个数据库了,里面还有个person的表格。
helper=newDBhelper(context);
//得到dbhelper实例化的时候获得数据库,并将该数据库的操作指针给db。
//这样就能在这个类里面玩了。哈哈
db=helper.getWritableDatabase();
}
/*
* 增加数据到数据库中这里是增加我们写的person的类中的数据。使用的list,可以一次添加很多个体*/
public voidadd(List<Person> persons){
//十分建议这里要使用try,catch,finally
//后面的updateage和deleteOldPerson和query未加就出了些问题就直接程序悲剧。
//准备传送
db.beginTransaction();
try{
//inti=0;
for(Personperson:persons)
{
//i++;
ContentValuescv = new ContentValues();
//cv.put("_id",i );
//放入各个属性。
cv.put("name",person.name);
cv.put("arg",person.age);
cv.put("info",person.info);
//有些好的方法就是happy啊,强势直接插入。
//往person表格插入个体cv,貌似些null是不好的,特别当cv为空的时候。可以指定一个string吧。自己试试咯。
db.insert("person",null,cv);
}
//这句是sqlite语句中的插入语句,如果你对sqlite像我一样啥都不懂,还是用inert的方法吧。
//db.execSQL("INSERTINTO person VALUES(null,?,?,?)",newObject[]{person.name,person.age,person.info} );
//传送成功
db.setTransactionSuccessful();
}finally{
//无论如何,此句被执行,退出传送。
db.endTransaction();
}
}
//更新xx人的年纪,这里更据名字找到xx人。
public voidupdateAge(Person person){
ContentValuescv=new ContentValues();
cv.put("arg",person.age);
//从person表格中找到名字等于xx的人,并更新其年纪。
db.update("person", cv,"name = ?",newString[]{person.name});
}
//删掉年纪大于xx的人,太残忍了。。。
public voiddeleteOldPerson(Person person)
{
//就是这样~~
db.delete("person","arg>=?",newString[]{String.valueOf(person.age)});
}
//查询数据,用list的方式返回查询到person所有的个体。这就是封装啊。
publicList<Person> query(){
ArrayList<Person>persons=new ArrayList<Person>();
//得到一个返回所有个体的游标
Cursorc=queryTheCursor();
//一个一个个体的往下移动。
while(c.moveToNext())
{
Personperson=new Person();
//这里记得要有合适的类型取回数据。
person._id=c.getInt(c.getColumnIndex("_id"));
person.name=c.getString(c.getColumnIndex("name"));
person.age=c.getInt(c.getColumnIndex("arg"));
person.info=c.getString(c.getColumnIndex("info"));
persons.add(person);
}
//时刻记住要close一些东西。
c.close();
returnpersons;
}
//返回得到所有个体的游标
publicCursor queryTheCursor(){
Cursorc=db.rawQuery("SELECT* FROM person",null);
return c;
}
public voidcloseDB(){
db.close();
}
}
代码下载地址:
http://www.eoeandroid.com/thread-275095-1-1.html