开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建、管理数据库。但是当我们需要去做增删改查的操作的时候,就得通过getWritableDatabase获取一个SQLiteDataBase然后老老实实去写操作值的put以及查询返回的Cursor处理,其实我们可以搞一个对象来帮我们干这些事情,打造属于你自己的数据库操作类。
- 主要优点
1.自动跟据类名创建表,通过反射字段创建表的列数据
2.不用或少用SQL语句就能进行增删改查的功能
- DatabaseHelper继承SQLiteOpenHelper
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME ="Demo.db";
private Class<?> mClass = null;
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DatabaseHelper(Context context,String db_name,int db_version, Class<?> clazz) {
this(context,db_name, null, db_version);
this.mClass = clazz;
}
//创建表,根据类名创建表名
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Utils.getCreateTableSql(mClass));
}
//更新表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Utils.dropTablesByClasses(db,mClass);
onCreate(db);
}
}
- DatabaseUtil具体的增删该查工具类
public class DatabaseUtils {
private DatabaseHelper mDatabaseHelper;
private SQLiteDatabase db = null;
private Context mContext;
private String db_name;
private static DatabaseUtils mUtils;
/**
*
* @param context
* @param db_name 数据库名字
* @param db_version 数据库版本
* @param clazz 类名(后面会作为创建表的名字)
*/
private DatabaseUtils(Context context,String db_name,int db_version, Class<?> clazz){
this.mDatabaseHelper = new DatabaseHelper(context,db_name,db_version,clazz);
this.mContext = context;
this.db_name = db_name;
db = mDatabaseHelper.getWritableDatabase();
}
//单例模式
public static DatabaseUtils getInstance(Context context,String db_name,int db_version, Class<?> clazz){
if(mUtils == null){
mUtils = new DatabaseUtils(context,db_name,db_version,clazz);
}
return mUtils;
}
/**
* 关闭数据库
*/
public synchronized void closeDataBase() {
db.close();
mDatabaseHelper = null;
db = null;
}
/**
* 删除数据库
*
* @return 成功返回true,否则返回false
*/
public synchronized boolean deleteDataBase() {
return mContext.deleteDatabase(db_name);
}
/**
* 插入一条数据
*
* @param obj
* @return 返回-1代表插入数据库失败,否则成功
* @throws IllegalAccessException
*/
public synchronized long insert(Object obj) {
Class<?> modeClass = obj.getClass();
Field[] fields = modeClass.getDeclaredFields();
ContentValues values = new ContentValues();
for (Field fd : fields) {
fd.setAccessible(true);
String fieldName = fd.getName();
//剔除主键id值得保存,由于框架默认设置id为主键自动增长
if (fieldName.equalsIgnoreCase("id") || fieldName.equalsIgnoreCase("_id")) {
continue;
}
putValues(values, fd, obj);
}
return db.insert(Utils.getTableName(modeClass), null, values);
}
/**
* 查询数据库中所有的数据
*
* @param clazz
* @param <T> 以 List的形式返回数据库中所有数据
* @return 返回list集合
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws InvocationTargetException
*/
public synchronized <T> List<T> findAll(Class<T> clazz) {
Cursor cursor = db.query(clazz.getSimpleName(), null, null, null, null, null, null);
return getEntity(cursor, clazz);
}
/**
* 根据指定条件返回满足条件的记录
*
* @param clazz 类
* @param select 条件语句 :("url=?")
* @param selectArgs 条件(new String[]{url}) 查询id=0的记录
* @param <T> 类型
* @return 返回满足条件的list集合
* //String sql = "select thread_id, start_pos, end_pos,compelete_size,url from download_info where url=?";
*/
public synchronized <T> List<T> findByArgs(Class<T> clazz, String select, String[] selectArgs) {
Cursor cursor = db.query(clazz.getSimpleName(), null, select, selectArgs, null, null, null);
return getEntity(cursor, clazz);
}
/**
* 通过id查找制定数据
*
* @param clazz 指定类
* @param id 条件id
* @param <T> 类型
* @return 返回满足条件的对象
*/
public synchronized <T> T findById(Class<T> clazz, int id) {
Cursor cursor = db.query(clazz.getSimpleName(), null, "id=" + id, null, null, null, null);
List<T> list = getEntity(cursor, clazz);
return list.get(0);
}
/**
* 删除记录一条记录
*
* @param clazz 需要删除的类名
* @param id 需要删除的 id索引
*/
public synchronized void deleteById(Class<?> clazz, long id) {
db.delete(Utils.getTableName(clazz), "id=" + id, null);
}
/**
* 删除数据库中指定的表
*
* @param clazz
*/
public synchronized void deleteTable(Class<?> clazz) {
db.execSQL("DROP TABLE IF EXISTS" + Utils.getTableName(clazz));
}
/**
* 更新一条记录
*
* @param clazz 类
* @param values 更新对象
* @param id 更新id索引
*/
public synchronized void updateById(Class<?> clazz, ContentValues values, long id) {
db.update(clazz.getSimpleName(), values, "id=" + id, null);
}
/**
*
* @param clazz 类
* @param values 更新的对象(compelete_size=?)
* @param whereClause where语句(where url=? and thread_id=?)
* @param whereArgs where语句的值
* String sql = "update download_info set compelete_size=? where thread_id=? and url=?";
*/
public synchronized void updateByArgs(Class<?> clazz, ContentValues values,String whereClause, String[] whereArgs) {
db.update(clazz.getSimpleName(), values,whereClause , whereArgs);
}
- 如何使用
public void onClick(View v) {
switch (v.getId()) {
case R.id.insert:
People people = new People();
people.setDate("hahahhahha");
people.setDevice_id(89757);
people.setDevice_name("Android");
people.setTime("2012.12.12");
people.setUsername("乔布斯");
mInstance.insert(people);
break;
case R.id.update:
ContentValues values = new ContentValues();
values.put("date","xixixxixixixixixi");
mInstance.updateByArgs(People.class,values,"device_id=?",new String[]{"9577"} );
break;
case R.id.query:
mInstance.findAll(People.class);
break;
case R.id.delete:
mInstance.deleteByArgs(People.class,"username=?",new String[]{"乔布斯"});
break;
}
}