2010-11-14 21:29 SQLite数据库的操作应用【转】

一:在android系统中除了文件和sharedPreferences 可以存储数据外,还可以用SQLite数据库,它是android自带的嵌入式的关系型的数据库,它支持null,Integer,real,text,blod(二进制数据)五种数据类型,但实际运算和保存数据时它可以接受其它数据类型,只是这时候会转换为对应的五种数据类型。 但有一种情况例外:定义为Integer primary key 的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。另外,SQLite在解析Create Table语句时,会忽略create table语句中跟在字段后面的数据类型信息。

二:在程序初始化时候,必须先建立数据库以对数据库进行更新,所以这里需要继承一个 SQLiteOpenHelper抽象类,这里有两个方法 onCreate(),onUpgreade()两个方法,前者用来创建数据库及对数据库的一些初始化操作,后者是当数据库版本进行更新时候用。下面的例子是创建了一个数据库名为:nyist,版本为 1,的数据库,并在数据库中创建了一个person表。这里利用了构造函数传入了 数据库名和版本名常量,参数为Context 对象。

public class DatebaseHelper extends SQLiteOpenHelper {
public final static String NAME="nyist";
public final static int VERSION=1;
public DatebaseHelper(Context context) {
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), age integer)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS person");
onCreate(db);

}

}

三:用SQLiteDatabase来操作SQLite数据库。

这里主要用 exeSQL(),rawQuery()分别用来对insert,delete,update这些对数据库更新的操作,select查询的操作。下面的例子就是CRUD操作。

public class DatebaseService {
private DatebaseHelper dbHelper;
public DatebaseService(Context context) {
this.dbHelper = new DatebaseHelper(context);
}

//保存数据。
public void save(Person person){
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.execSQL("insert into person(name,age) values(?,?)", new Object[]{person.getName(),person.getAge()});

}

//更新数据
public void update(Person person){
SQLiteDatabase db=dbHelper.getReadableDatabase();
db.execSQL("update person set name=?,age=? where personid=?", new Object[]{person.getName(),person.getAge(),person.getPersonid()});
}

//查找数据
public Person find(Integer personid){
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from person where personid=?",new String[]{personid.toString()} );
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
int id=cursor.getInt(cursor.getColumnIndex("personid"));
return new Person(id,name,age);

}
return null;
}

//删除数据
public void delete(Integer personid){
SQLiteDatabase db=dbHelper.getReadableDatabase();
db.execSQL("delete from person where personid=?",new Object[]{personid});
}
public Long getCount(){
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select count(*) from person", null);
cursor.moveToFirst();
return cursor.getLong(0);
}

//分页显示 返回的是List集合
public List<Person> getScrollData(int offer,int maxResult){
List<Person> persons=new ArrayList<Person>();
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from person limit ?,?",new String[]{String.valueOf(offer),String.valueOf(maxResult)});
while(cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("personid"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
persons.add(new Person(id,name,age));


}
return persons;
}

//分页显示 返回的是Cursor游标
public Cursor getCursorScrollData(int offer,int maxResult){
List<Person> persons=new ArrayList<Person>();
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select personid as _id,name,age from person limit ?,?",new String[]{String.valueOf(offer),String.valueOf(maxResult)});

return cursor;
}

}
四:除了exeSQL(),rawQuery()这两个方法外,SQLiteDatabase类也专门提供了一些函数来操作数据库,有 insert,delete,update,query(),不过这些函数需要的参数比较多,只适合对SQL语句不太懂的菜鸟用,对于熟悉SQL语句的程序员最好使用exeSQL(),rawQuery(),这两个方法比较直观明了。

五:调用getWritableDatabase()或getReadableDatabase()方法后,会缓存SQLiteDatabase实例,因为这里是手机应用程序,一般只有一个用户访问数据库,所以建议不关闭数据库,保持连接状态。getWritableDatabase(),getReadableDatabase的区别是当数据库写满时候,调用前者会报错,调用后者不会,所以如果是不是更新数据库的话,最好调用后者来获得数据库连接。

六:关于事务。

当执行两个或多条语句时候,有一条出现错误不能执行,其它的也语句也不能执行。比如银行系统,当转账时候,钱数扣除,转账的号数据错误,这个事务就会中止。

public void payment(){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.beginTransaction();//开启事务
try{
db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{"1"});
db.execSQL("update person 55set amount=amount+10 where personid=?", new Object[]{"2"});
db.setTransactionSuccessful();//设置事务标志为成功,在结束事务将会提交事务
}finally{
db.endTransaction();//结束事务,默认是回滚事务
}
}

原帖地址:http://hi.baidu.com/jlhaoran/item/45ddd51744be01572a3e221f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值