|
android上可以使用sqlite数据库,sqlite支持5中数据类型:null,INTEGER,REAL,TEXT,BLOB,可以在定义的时候使用varchar(n),char(n),decimal,但是在运输或者保存时会转换成5中基本类型。
可以保存任意类型的数据到任意类型的字段中,比如:可以把字符串放入到integer的年龄中。只有一种例外情况:INTEGER PRIMARY KEY 只能存储64位整数,存放其他数据会报错。
在解析create table语句时,会忽略字段后的类型,但是为了保持代码的可读性还是要加上。
为了方便开分人员操作sqlite,android提供了两个工具类:SQLiteOpenHelper , SQLiteDataBase
SQLiteOpenHelper可以帮助开分人员方便地创建、更新数据库。该类是一个抽象类,需要继承它才能使用。需要重写
onCreate 和onUpgrade方法。还有两个重要的字段,数据库版本号int version,数据库名称String name
onCreate(SQLiteDatabase sqlitedatabase):只会调用一次,适合在其中创建表结构
onUpgrade(SQLiteDatabase sqlitedatabase,int oldVersion, int newVersion)
当版本号发生变化时调用,可以在方法内修改变化的表结构,或者删除并重新创建表。后两个参数为旧版本号、新版本号。在程序有多个版本号时,可以对比就版本号多对应更新。
getWriteableDatabase():获取可读写的数据库,一旦数据库打开,则会被缓存在内存中,之后在你需要读写时可以很快的调用此方法。当磁盘满时,调用此方法会报错。最后,要在使用完数据库后调用close()方法关闭数据库。调用本方法可能会持续很长时间,所以不要在主线程中调用,包括 ContentProvider.onCreate()。
getReadableDatabase():正常情况与getWriteableDatabase()返回一样可读写数据库,只有在磁盘满时可能返回只读数据库。
代码示例:
public class DBHelper extends SQLiteOpenHelper {
private static final int version = 4;
private static final String name = "persion";
private static final String TAG = "DBHelper";
public DBHelper(Context context) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase sqlitedatabase) {
sqlitedatabase.execSQL("create table persion( _id integer primary key autoincrement," +
"name varchar(20),age int)");
}
@Override
public void onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j) {
Log.i(TAG, "on upgrade");
sqlitedatabase.execSQL("drop table IF EXISTS persion");
onCreate(sqlitedatabase);
}
}
SQLiteDatabase 管理sqlite,可创建表、增、删、改、查,还可以进行分页查询。主要方法:
execSQL(String sql):通过sql语句可以进行创建、增、删、改表等行为。但是对于参数有特殊符号的处理比较麻烦,建议
使用execSQL(String sql, Object[] bindArgs)
execSQL(String sql, Object[] bindArgs):与execSQL(String sql)实现功能相同,但是将参数从sql语句中抽离出来,以?代
替,参数按在sql语句出现的顺序存放到Object数组中。(小窍门:在创建表示,将主键名字设为"_id",这样以后用CursorAdapter
会方便很多,CursorAdapter 与Cursor配合使用是,要求表的主键必须是"_id",否则就会报错)
Cursor rawQuery(String sql, String[] selectionArgs)查询语句,返回Cursor对象,与java里的ResultSet类似。
查询示例:
public List<Persion> getPersions(int startID,int endID){
String sql = "select * from persion limit ?,?";
String[] params = {String.valueOf(startID),String.valueOf(endID)};
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
Cursor cursor = sqliteDatabase.rawQuery(sql, params);
ArrayList<Persion> persionList = new ArrayList<Persion>();
while(cursor.moveToNext()){
persionList.add(new Persion(cursor.getInt(0),cursor.getString(1),cursor.getInt(2)));
}
return persionList;
}
sqlite中分页sql语句:select * from persion limit ?,? ,参数为起始与截止id
事务:使用beginTransaction()方法标识事务的开始,setTransactionSuccessful()标识一系列动作都执行成功,如果要提交事务,必须设置setTransactionSuccessful()
endTransaction(),提交事务前会检查setTransactionSuccessful()标志,如果标志成功则提交事务,如果没有标志,则会默认回滚事务。
代码示例:
/**
* 运用事物
* @param persion
*/
public void save(Persion persion){
String sql = "insert into persion (name,age)values(?,?)";
Object[]paras = {persion.getName(),persion.getAge()};
SQLiteDatabase sqliteDatabase = null;
try{
sqliteDatabase = dbHelper.getWritableDatabase();
sqliteDatabase.beginTransaction();
sqliteDatabase.execSQL(sql,paras);
sqliteDatabase.setTransactionSuccessful();
}catch(Exception e){
}finally{
sqliteDatabase.endTransaction();
}
}
SQLiteDatabase应用:
public class PersionService {
private DBHelper dbHelper;
public PersionService(Context context){
dbHelper = new DBHelper(context);
}
/**
* 运用事物
* @param persion
*/
public void save(Persion persion){
String sql = "insert into persion (name,age)values(?,?)";
Object[]paras = {persion.getName(),persion.getAge()};
SQLiteDatabase sqliteDatabase = null;
try{
sqliteDatabase = dbHelper.getWritableDatabase();
sqliteDatabase.beginTransaction();
sqliteDatabase.execSQL(sql,paras);
sqliteDatabase.setTransactionSuccessful();
}catch(Exception e){
}finally{
sqliteDatabase.endTransaction();
}
}
public void update(Persion persion){
String sql = "update persion set name=?,age=? where _id=?";
Object[]params = {persion.getName(),persion.getAge(),persion.getId()};
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
sqliteDatabase.execSQL(sql,params);
}
public Persion find(int id ){
String sql = "select * from persion where _id=?";
String[]param = {String.valueOf(id)};
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
Cursor cursor = sqliteDatabase.rawQuery(sql, param);
while(cursor.moveToNext()){
return new Persion(cursor.getInt(0),cursor.getString(1),cursor.getInt(2));
}
return null;
}
public void delete(int...ids){
StringBuffer sb = new StringBuffer();
for(int id:ids){
sb.append(id).append(",");
}
sb.deleteCharAt(sb.length()-1);
String sql = "delete from persion where _id in(?)";
Object [] param = {sb.toString()};
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
sqliteDatabase.execSQL(sql,param);
}
public List<Persion> getPersions(int startID,int endID){
String sql = "select * from persion limit ?,?";
String[] params = {String.valueOf(startID),String.valueOf(endID)};
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
Cursor cursor = sqliteDatabase.rawQuery(sql, params);
ArrayList<Persion> persionList = new ArrayList<Persion>();
while(cursor.moveToNext()){
persionList.add(new Persion(cursor.getInt(0),cursor.getString(1),cursor.getInt(2)));
}
return persionList;
}
public int getCount(){
String sql = "select count(*) from persion";
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
Cursor cursor = sqliteDatabase.rawQuery(sql, null);
while(cursor.moveToNext()){
return cursor.getInt(0);
}
return 0;
}
public Cursor getRawScrollData(int startID,int endId){
String sql = "select * from persion limit?,?";
String[] params = {String.valueOf(startID),String.valueOf(endId)};
SQLiteDatabase sqliteDatbase = dbHelper.getReadableDatabase();
return sqliteDatbase.rawQuery(sql, params);
}
}
|
|