編輯:關於Android編程
數據庫工具類,優雅的管理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 queryForObject(RowMapper 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 List queryForList(RowMapper rowMapper, String sql,
String[] selectionArgs) {
Cursor cursor = null;
List list = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql, selectionArgs);
list = new ArrayList();
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 List queryForList(RowMapper rowMapper, String sql,
int startResult, int maxResult) {
Cursor cursor = null;
List list = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.rawQuery(sql + " limit ?,?", new String[] {
String.valueOf(startResult), String.valueOf(maxResult) });
list = new ArrayList();
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語句where關鍵字後面的部分,在條件子句允許使用占位符"?"
* @param selectionArgs
* 對應於selection語句中占位符的值,值在數組中的位置與占位符在語句中的位置必須一致,否則就會有異常
* @param groupBy
* 對結果集進行分組的group by語句(不包括GROUP BY關鍵字)。傳入null將不對結果集進行分組
* @param having
* 對查詢後的結果集進行過濾,傳入null則不過濾
* @param orderBy
* 對結果集進行排序的order by語句(不包括ORDER BY關鍵字)。傳入null將對結果集使用默認的排序
* @param limit
* 指定偏移量和獲取的記錄數,相當於select語句limit關鍵字後面的部分,如果為null則返回所有行
* @return
*/
public List queryForList(RowMapper rowMapper, String table,
String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy, String limit) {
List list = null;
Cursor cursor = null;
try {
dataBase = dBManager.openDatabase();
cursor = dataBase.query(table, columns, selection, selectionArgs,
groupBy, having, orderBy, limit);
list = new ArrayList();
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
*/
public interface RowMapper {
/**
*
* @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 bitmap你不知道的一些事
本文為大家分享了Android bitmap使用細節,供大家參考,具體內容如下1、計算機表示圖形的幾種方式1)BMP :幾乎不進行壓縮 占用空間比較大 2)JPG : 在
View和ViewGroup的基本繪制流程
需要了解的先來張圖說明一下它們的關系你還要知道ViewGroup之間是可以嵌套的.View的繪制流程不知道大家有沒有這種疑惑, 為什麼我們在寫布局文件的時候, 一定要寫l
Android ViewDragHelper解析
簡介: 一般我們在自定義ViewGroup 的時候會通常都會用到onInterceptTouchEvent ,onTouchEvent 這些方法去進行距離的判斷然後利用s
Android仿微信主界面設計
先來一張效果圖 一.ActionBar的設計首先是main.xml,先定義這些菜單,界面稍後在調整<menu xmlns:android=http://schema