一:在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=?",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,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,age from person limit ?,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();//结束事务,默认是回滚事务 } }
原文链接:https://www.f2er.com/sqlite/200200.html