加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite数据库的操作

发布时间:2020-12-13 00:00:55 所属栏目:百科 来源:网络整理
导读:一:在android系统中除了文件和sharedPreferences 可以存储数据外,还可以用SQLite数据库,它是android自带的嵌入式的关系型的数据库,它支持null,Integer,real,text,blod(二进制数据)五种数据类型,但实际运算和保存数据时它可以接受其它数据类型,只

一:在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();//结束事务,默认是回滚事务 } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读