`
lansuiyun
  • 浏览: 28596 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android:sqlite

阅读更多

 

      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);
	}
}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics