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 ...
随机推荐
- Jersey 2.x 运行项目
现在我们已经有可以可以运行的项目了,让我们队这个项目进行一些测试吧. 你需要运行下面的一些命令行: mvn clean test 这个命令将会对项目进行编译后运行单元测试. 你应该会看到和下面类似的输 ...
- IE6不兼容hover已解决
新建一个csshover.htc文件,一下是csshover.htc内容 <public:attach event="ondocumentready" onevent=&qu ...
- http 请求和格式
get 请求:从指定的资源请求数据. post请求:向指定的资源提交要被处理的数据. head请求:与 GET 相同,但只返回 HTTP 报头,不返回资源实体. option请求:返回服务器支持的 H ...
- ASP.NET的内置对象 —— Response 对象
在 ASP.NET 中,页面实际上是一个输出 HTML 的可执行对象. 传统的 ASP 程序通常将 ASP 代码和 HTML 标签集成在一个文件中,或者将其分离于多个文 件. 当执行文件时,服务器回从 ...
- dubbo使用的zk客户端
在使用dubbo的过程中,当注册中心的数据修改后,新的配置是怎样刷到consumer和provider的?本文以consumer为例,进行分析. dubbo使用的是zkclient的jar,而zkcl ...
- spring cloud 学习(二)关于 Eureka 的学习笔记
关于 Eureka 的学习笔记 个人博客地址 : https://zggdczfr.cn/ ,欢迎光临~ 前言 Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Sprin ...
- spring boot 学习(九)小工具篇:?秒防刷新
注解 + 拦截器:?秒防刷新 小工具篇:工具许多都是我以前在 github 之类开源平台找到的小工具类,作者的信息什么的许多都忘了.先说声不好意思了.若有相关信息,麻烦提醒一下~ 解释 所谓的?秒防刷 ...
- 获取URL的数据
<!doctype html><html><head><meta charset="utf-8"><meta name=&qu ...
- spoj8406
题解: 二分+树状数组 记录以下i在当前拍第几 代码: #include<bits/stdc++.h> using namespace std; ; int a[N],f1[N],f2[N ...
- Django(三)url和返回
location 最后一个文件夹名就是project名,我用了Django_Plan. Application 是自动加入的APP名字,我用了Plan 编辑Django_Plan\Django_Pla ...