android 工具类 数据库管理
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/xuduzhoud/article/details/27540301
数据库工具类,优雅的管理android中的sqlite
package csdn.shimiso.eim.db;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* SQLite数据库模板工具类
*
* 该类提供了数据库操作经常使用的增删改查,以及各种复杂条件匹配,分页,排序等操作
*
* @see SQLiteDatabase
*/
public class SQLiteTemplate {
/**
* Default Primary key
*/
protected String mPrimaryKey = "_id";
/**
* DBManager
*/
private DBManager dBManager;
/**
* 是否为一个事务
*/
private boolean isTransaction = false;
/**
* 数据库连接
*/
private SQLiteDatabase dataBase = null;
private SQLiteTemplate() {
}
private SQLiteTemplate(DBManager dBManager, boolean isTransaction) {
this.dBManager = dBManager;
this.isTransaction = isTransaction;
}
/**
* isTransaction 是否属于一个事务 注:一旦isTransaction设为true
* 全部的SQLiteTemplate方法都不会自己主动关闭资源,需在事务成功后手动关闭
*
* @return
*/
public static SQLiteTemplate getInstance(DBManager dBManager,
boolean isTransaction) {
return new SQLiteTemplate(dBManager, isTransaction);
}
/**
* 运行一条sql语句
*
* @param name
* @param tel
*/
public void execSQL(String sql) {
try {
dataBase = dBManager.openDatabase();
dataBase.execSQL(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
}
/**
* 运行一条sql语句
*
* @param name
* @param tel
*/
public void execSQL(String sql, Object[] bindArgs) {
try {
dataBase = dBManager.openDatabase();
dataBase.execSQL(sql, bindArgs);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
}
/**
* 向数据库表中插入一条数据
*
* @param table
* 表名
* @param content
* 字段值
*/
public long insert(String table, ContentValues content) {
try {
dataBase = dBManager.openDatabase();
// insert方法第一參数:数据库表名。第二个參数假设CONTENT为空时则向表中插入一个NULL,第三个參数为插入的内容
return dataBase.insert(table, null, content);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 批量删除指定主键数据
*
* @param ids
*/
public void deleteByIds(String table, Object... primaryKeys) {
try {
if (primaryKeys.length > 0) {
StringBuilder sb = new StringBuilder();
for (@SuppressWarnings("unused")
Object id : primaryKeys) {
sb.append("?").append(",");
}
sb.deleteCharAt(sb.length() - 1);
dataBase = dBManager.openDatabase();
dataBase.execSQL("delete from " + table + " where "
+ mPrimaryKey + " in(" + sb + ")",
(Object[]) primaryKeys);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
}
/**
* 依据某一个字段和值删除一行数据, 如 name="jack"
*
* @param table
* @param field
* @param value
* @return 返回值大于0表示删除成功
*/
public int deleteByField(String table, String field, String value) {
try {
dataBase = dBManager.openDatabase();
return dataBase.delete(table, field + "=?", new String[] { value });
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 依据条件删除数据
*
* @param table
* 表名
* @param whereClause
* 查询语句 參数採用?
* @param whereArgs
* 參数值
* @return 返回值大于0表示删除成功
*/
public int deleteByCondition(String table, String whereClause,
String[] whereArgs) {
try {
dataBase = dBManager.openDatabase();
return dataBase.delete(table, whereClause, whereArgs);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 依据主键删除一行数据
*
* @param table
* @param id
* @return 返回值大于0表示删除成功
*/
public int deleteById(String table, String id) {
try {
dataBase = dBManager.openDatabase();
return deleteByField(table, mPrimaryKey, id);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 依据主键更新一行数据
*
* @param table
* @param id
* @param values
* @return 返回值大于0表示更新成功
*/
public int updateById(String table, String id, ContentValues values) {
try {
dataBase = dBManager.openDatabase();
return dataBase.update(table, values, mPrimaryKey + "=?",
new String[] { id });
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 更新数据
*
* @param table
* @param values
* @param whereClause
* @param whereArgs
* @return 返回值大于0表示更新成功
*/
public int update(String table, ContentValues values, String whereClause,
String[] whereArgs) {
try {
dataBase = dBManager.openDatabase();
return dataBase.update(table, values, whereClause, whereArgs);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
/**
* 依据主键查看某条数据是否存在
*
* @param table
* @param id
* @return
*/
public Boolean isExistsById(String table, String id) {
try {
dataBase = dBManager.openDatabase();
return isExistsByField(table, mPrimaryKey, id);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return null;
}
/**
* 依据某字段/值查看某条数据是否存在
*
* @param status
* @return
*/
public Boolean isExistsByField(String table, String field, String value) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT COUNT(*) FROM ").append(table).append(" WHERE ")
.append(field).append(" =?");
try {
dataBase = dBManager.openDatabase();
return isExistsBySQL(sql.toString(), new String[] { value });
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return null;
}
/**
* 使用SQL语句查看某条数据是否存在
*
* @param sql
* @param selectionArgs
* @return
*/
public Boolean isExistsBySQL(String sql, String[] selectionArgs) {
Cursor cursor = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql, selectionArgs);
if (cursor.moveToFirst()) {
return (cursor.getInt(0) > 0);
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return null;
}
/**
* 查询一条数据
*
* @param rowMapper
* @param sql
* @param args
* @return
*/
public <T> T queryForObject(RowMapper<T> rowMapper, String sql,
String[] args) {
Cursor cursor = null;
T object = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql, args);
if (cursor.moveToFirst()) {
object = rowMapper.mapRow(cursor, cursor.getCount());
}
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return object;
}
/**
* 查询
*
* @param rowMapper
* @param sql
* @param startResult
* 開始索引 注:第一条记录索引为0
* @param maxResult
* 步长
* @return
*/
public <T> List<T> queryForList(RowMapper<T> rowMapper, String sql,
String[] selectionArgs) {
Cursor cursor = null;
List<T> list = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql, selectionArgs);
list = new ArrayList<T>();
while (cursor.moveToNext()) {
list.add(rowMapper.mapRow(cursor, cursor.getPosition()));
}
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return list;
}
/**
* 分页查询
*
* @param rowMapper
* @param sql
* @param startResult
* 開始索引 注:第一条记录索引为0
* @param maxResult
* 步长
* @return
*/
public <T> List<T> queryForList(RowMapper<T> rowMapper, String sql,
int startResult, int maxResult) {
Cursor cursor = null;
List<T> list = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql + " limit ?,?
", new String[] {
String.valueOf(startResult), String.valueOf(maxResult) });
list = new ArrayList<T>();
while (cursor.moveToNext()) {
list.add(rowMapper.mapRow(cursor, cursor.getPosition()));
}
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return list;
}
/**
* 获取记录数
*
* @return
*/
public Integer getCount(String sql, String[] args) {
Cursor cursor = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery("select count(*) from (" + sql + ")",
args);
if (cursor.moveToNext()) {
return cursor.getInt(0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return 0;
}
/**
* 分页查询
*
* @param rowMapper
* @param table
* 检索的表
* @param columns
* 由须要返回列的列名所组成的字符串数组,传入null会返回全部的列。
* @param selection
* 查询条件子句,相当于select语句wherekeyword后面的部分,在条件子句同意使用占位符"?
"
* @param selectionArgs
* 相应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致。否则就会有异常
* @param groupBy
* 对结果集进行分组的group by语句(不包含GROUP BYkeyword)。传入null将不正确结果集进行分组
* @param having
* 对查询后的结果集进行过滤,传入null则只是滤
* @param orderBy
* 对结果集进行排序的order by语句(不包含ORDER BYkeyword)。传入null将对结果集使用默认的排序
* @param limit
* 指定偏移量和获取的记录数。相当于select语句limitkeyword后面的部分,假设为null则返回全部行
* @return
*/
public <T> List<T> queryForList(RowMapper<T> rowMapper, String table,
String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy, String limit) {
List<T> list = null;
Cursor cursor = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.query(table, columns, selection, selectionArgs,
groupBy, having, orderBy, limit);
list = new ArrayList<T>();
while (cursor.moveToNext()) {
list.add(rowMapper.mapRow(cursor, cursor.getPosition()));
}
} finally {
if (!isTransaction) {
closeDatabase(cursor);
}
}
return list;
}
/**
* Get Primary Key
*
* @return
*/
public String getPrimaryKey() {
return mPrimaryKey;
}
/**
* Set Primary Key
*
* @param primaryKey
*/
public void setPrimaryKey(String primaryKey) {
this.mPrimaryKey = primaryKey;
}
/**
*
* @author shimiso
*
* @param <T>
*/
public interface RowMapper<T> {
/**
*
* @param cursor
* 游标
* @param index
* 下标索引
* @return
*/
public T mapRow(Cursor cursor, int index);
}
/**
* 关闭数据库
*/
public void closeDatabase(Cursor cursor) {
if (null != dataBase) {
dataBase.close();
}
if (null != cursor) {
cursor.close();
}
}
}
android 工具类 数据库管理的更多相关文章
- [Android Pro] 常用的android工具类和库
reference to : http://blog.csdn.net/lovexieyuan520/article/details/50614086 这篇博客主要记录我认为比较有用的Android ...
- 摘录android工具类
import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.Pac ...
- Android工具类整合
Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...
- Android 工具类大全
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311 1.日志工具类L.java package com.zhy.uti ...
- 【Android 工具类】经常使用工具类(方法)大全
收集经常使用的工具类或者方法: 1.获取手机分辨率 /** * 获取手机分辨率 */ public static String getDisplayMetrix(Context context) { ...
- android 工具类之SharePreference
/** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 * 同样调用getPara ...
- android 工具类 DateUtil
提取了一些在开发过程中可能会用到的日期相关的函数作为工具类.供大家參考: /** * 日期操作工具类. * * @author shimiso */ public class DateUtil { p ...
- Android工具类-关于网络、状态的工具类
下方是一个很好的监测网络.状态的工具类 public class NetworkUtils { /** * 网络是否可用 * * @param activity * @return */ public ...
- 【Android工具类】Activity管理工具类AppManager
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack; import android.app.Activity; i ...
随机推荐
- sgu 126 Boxes
题意:较大的容量减较小的容量,较小的容量翻倍.问操作几回其中一个空. 开始用set判重,重复就不可行.不过状态最多有2e18种.不仅爆内存,还超时.然后找规律.发现只有比例为1:1,1:3,1:7,3 ...
- Ivan and Burgers CodeForces - 1100F (线性基)
大意: 给定n元素序列, m个询问$(l,r)$, 求$[l,r]$中选出任意数异或后的最大值 线性基沙茶题, 直接线段树暴力维护两个log还是能过的 #include <iostream> ...
- 删除php数组中的元素
删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: <?php $array = array(0 => "a", 1 => "b&qu ...
- 『cs231n』绪论
笔记链接 cs231n系列所有图片笔记均拷贝自网络,链接如上,特此声明,后篇不再重复. 计算机视觉历史 总结出视觉两个重要结论:1.基础的视觉神经识别的是简单的边缘&轮廓2.视觉是分层的 数据 ...
- TCP/IP四层与OSI七层模型
OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行实 ...
- Generate PDF in Sourcing through concurrent request,在EBS java并发中调用指定am的方法
package oracle.apps.pon.printing.cp; import java.io.InputStream; import java.io.FileOutputStream; im ...
- 32. Longest Valid Parentheses *HARD*
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- 提高C++程序运行效率的10个简单方法
转载: 一.尽量减少值传递,多用引用来传递参数.至于其中的原因,相信大家也很清楚,如果参数是int等语言自定义的类型可能能性能的影响还不是很大,但是如果参数是一个类的对象,那么其效率问题就不言而喻了. ...
- Logger.getLogger()和LogFactory.getLog()的区别
第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...
- Freemaker FTL指令常用标签及语法
https://blog.csdn.net/pengpengpeng85/article/details/52070602 FTL指令常用标签及语法 注意:使用freemaker,要求所有标签必须闭合 ...