Android数据库sqlite封装心得

本文介绍如何封装Android中的SQLiteDatabase类以简化数据库操作。通过创建DBHelper类实现数据库的单例模式管理,利用SQLiteOpenHelper进行数据库创建及版本管理。此外,还介绍了如何通过BeanColumns类来进一步封装表的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

怎样稍微对Android的SQLiteDatabase进行相应的封装呢?

SQLite是Android里面轻量实现的数据库, Android提供了SQLiteDatabase类用来创建和访问数据库对象。

 

当要打开和创建数据库对象时,会执行SQLiteDatabase .openOrCreateDatabase()方法;

当要执行sql语句的时候,我们会执行SQLiteDatabase .execSQL() 方法。

android里面也提供了SQLiteOpenHelper类,顾名思义,这个类是SQLiteDatabase的一个辅助类。通过这个类不仅可以生成数据库,并对数据库的版本进行管理。

当在程序当中调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法的时候,如果当前还没有数据,Android系统就会自动生成一个数据库。

 

 

package com.example.faithhopelove;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.faithhopelove.db.Group;

/**
 * 数据库访问辅助类
 */
public class DBHelper {

	private static DBHelper dbhelper = null;
	
	private DatabaseHelper databasehelper = null;
	
	private DBHelper(Context context){
		this.databasehelper = new DatabaseHelper(context );
	}
	 
	
	public synchronized static DBHelper getInstance(Context context){   //单例模型
	      if(dbhelper == null){
	    	  dbhelper = new DBHelper(context);
	      }	 return dbhelper;
	}
	
	public SQLiteDatabase getWritableDB(){
		return databasehelper.getWritableDatabase();
	}
	
	
	public SQLiteDatabase getReadableDB(){
		return databasehelper.getReadableDatabase();
	}
	
	public void closeDB(){
		databasehelper.close();
	}
	
	private class DatabaseHelper extends SQLiteOpenHelper{
		
		private static final String DATABASE_NAME = "hzbg.db";  //数据库名称
		private static final int DB_VERSION = 10;
		
		public DatabaseHelper(Context context, String name,
				CursorFactory factory, int version) {
			super(context, name, factory, version);
		}
		
		public DatabaseHelper(Context context){
			this(context, DATABASE_NAME, null, DB_VERSION);
		}
		
		@Override
		public void onCreate(SQLiteDatabase db) {
//			Log.d("TAG","onCreate");
			db.execSQL(PersonColumns.CREAT_TABLE(PersonColumns.TABLE_NAME()));
		    db.execSQL(GroupColumns.CREAT_TABLE(GroupColumns.TABLE_NAME()));
		    initGroup(db, GroupColumns.TABLE_NAME());
		    initPerosn(db,PersonColumns.TABLE_NAME());
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//			Log.d("TAG","onUpgrade");
			db.execSQL(PersonColumns.CREAT_TABLE(PersonColumns.TABLE_NAME()));
		    db.execSQL(GroupColumns.CREAT_TABLE(GroupColumns.TABLE_NAME()));
		}
		
	}

 
	public void initGroup(SQLiteDatabase db,String tableName) {
		String[] names = { Group.GROUP1, Group.GROUP2, Group.GROUP3 };
		int len = names.length;
		db.beginTransaction();
		try {
			for (int i = 0; i < len; i++) {
				ContentValues values = new ContentValues();
				values.put( GroupColumns.ID, i);
				values.put(GroupColumns.GROUPNAME, names[i]);
 				db.insert(tableName, null, values);
			}
			db.setTransactionSuccessful();
		} catch (Exception e) {
		} finally {
			db.endTransaction();
		}
	}


	public void initPerosn(SQLiteDatabase db, String table_NAME) {
		db.beginTransaction();
		try {
				ContentValues values = new ContentValues();
				values.put(PersonColumns.ID, "3");
				values.put(PersonColumns.USERNAME, "zhangkang");
				values.put(PersonColumns.BIRTH, "25");
				values.put(PersonColumns.ISMARRY, true);
				values.put(PersonColumns.SEX, "man");
				values.put(PersonColumns.BAPTISM, true);
				values.put(PersonColumns.ADDRESS, "china");
				values.put(PersonColumns.JOB, "programer");
				values.put(PersonColumns.PHONE, "110");
				values.put(PersonColumns.GROUPID, 1);
				values.put(PersonColumns.GROUPNAME, "信实组");
 				db.insert(table_NAME, null, values);
 
 				
 				db.setTransactionSuccessful();
		} catch (Exception e) {
		} finally {
			db.endTransaction();
		}
	}
		 
	
}

 

SQLiteOpenHelper在执行OnCreate的时候需要传入一个SQLiteDatabase 对象,SQLiteOpenHelper和 SQLiteDatabase是组合的关系。

这里的逻辑是将对于同一个数据库中的表的操作,都用一个类来进行管理。对于每张表中的逻辑封装到一个BeanColumns类当中,BeanColumns的作用是由它去跟SQLiteOpenHelper完成相应的业务表的创建和查询等等,这样下次如果有新的业务表的话,就只用再新建一个bean对象,新建一个BeanColumns对象,这样拓展性就比较好。
 

package com.example.faithhopelove;

public class PersonColumns {

	public static  String TABLE_NAME(){
		return "persons";
	} 
	public static final String ID = "id";  //ID
	
	public static final String USERNAME = "name";  //姓名
	
	public static final String PHONE = "phone";  //电话号码
	
	public static final String  SEX = "sex";  //性别
	
	public static final String BIRTH = "birth";  //生日
	
	public static final String JOB = "job";   //工作
	
	public static final String ISMARRY = "ismarried";   //是否结婚
	
	public static final String ADDRESS = "address";   //地址
	
	public static final String BAPTISM = "baptism";
	
	public static final String GROUPID = "groupid";   //组id
	
	public static final String GROUPNAME = "groupname";  //组名
	
	public static final String[] COLUMN_ARRAY = {
		ID,
		USERNAME,
		PHONE,
		SEX,
		BIRTH,
		JOB,
		ISMARRY,
		ADDRESS,
		BAPTISM,
		GROUPID,
		GROUPNAME
	};
	
	
	public static String CREAT_TABLE(String tableName){
		return new StringBuffer().
				append("CREATE TABLE IF NOT EXISTS ").append(tableName).
				append("(").
				append(ID).append(" TEXT PRIMARY KEY NOT NULL,").
				append(USERNAME).append(" TEXT,").
				append(PHONE).append(" TEXT,").
				append(SEX).append(" TEXT,").
				append(BIRTH).append(" TEXT,").
				append(JOB).append(" TEXT,").
				append(ISMARRY).append(" INTEGER DEFAULT 1,").
				append(ADDRESS).append(" INTEGER DEFAULT 0,").
				append(BAPTISM).append(" TEXT ,").
				append(GROUPID).append(" INTEGER DEFAULT 0, ").
				append(GROUPNAME).append(" TEXT  ").
				append(");").toString();
	}
	
	private static String DROP_TABLE(){
		return "DROP TABLE IF EXISTS " +  TABLE_NAME();
	}
	
}
 

 

     附录:github完整项目地址

    https://github.com/preqel/FaithHopeLove









一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值