Java 这是在android中为SqliteHelper执行singleton的正确方法吗?
我试图在android中为SqliteHelper编写一个合适的单例访问。从这里和那里得到了一些零碎的东西来形成最终版本,但不确定我是否遗漏了一些东西Java 这是在android中为SqliteHelper执行singleton的正确方法吗?,java,android,sqlite,android-studio,android-sqlite,Java,Android,Sqlite,Android Studio,Android Sqlite,我试图在android中为SqliteHelper编写一个合适的单例访问。从这里和那里得到了一些零碎的东西来形成最终版本,但不确定我是否遗漏了一些东西 public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "EffiaSoft"; private static final int DATABASE_VERSION = 1; pr
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "EffiaSoft";
private static final int DATABASE_VERSION = 1;
private static SQLiteOpenHelper sInstance;
private Semaphore semaphore = new Semaphore(1);
private Context mCxt;
/**
* Constructor should be private to prevent direct instantiation.
* make call to static method "getInstance()" instead.
*/
private DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mCxt = context;
}
public static synchronized SQLiteOpenHelper getInstance(Context context) {
if (sInstance == null) {
sInstance = new DatabaseHelper(context.getApplicationContext());
}
return sInstance;
}
private static <T> void setFields(Cursor cursor, T returnObject, Field[] declaredFields, String[] cursorColumns) throws IllegalAccessException {
for (Field declaredField : declaredFields) {
String fieldName = declaredField.getName();
boolean hasColumn = false;
for (String columnName : cursorColumns) {
if (columnName.equals(fieldName))
hasColumn = true;
else
continue;
break;
}
if (hasColumn) {
declaredField.setAccessible(true);
int columnIndex = cursor.getColumnIndex(fieldName);
if (columnIndex >= 0) {
if (declaredField.getType() == Character.TYPE) {
String value = cursor.getString(columnIndex);
if (!ValidationHelper.isNullOrEmpty(value) && value.length() == 1) {
char c = value.charAt(0);
declaredField.set(returnObject, c);
}
} else if (declaredField.getType() == Short.TYPE) {
declaredField.set(returnObject, cursor.getShort(columnIndex));
} else if (declaredField.getType() == Integer.TYPE) {
declaredField.set(returnObject, cursor.getInt(columnIndex));
} else if (declaredField.getType() == Long.TYPE) {
declaredField.set(returnObject, cursor.getLong(columnIndex));
} else if (declaredField.getType() == Float.TYPE) {
declaredField.set(returnObject, cursor.getFloat(columnIndex));
} else if (declaredField.getType() == Double.TYPE) {
declaredField.set(returnObject, cursor.getDouble(columnIndex));
} else if (declaredField.getType() == Boolean.TYPE) {
String temp = cursor.getString(columnIndex);
declaredField.setBoolean(returnObject, temp.equalsIgnoreCase("Y"));
} else if (Date.class.equals(declaredField.getType())) {
if (!ValidationHelper.isNullOrEmpty(cursor.getString(columnIndex))) {
Date date = ValueFormatter.formatDateTime(cursor.getString(columnIndex));
declaredField.set(returnObject, date);
}
} else if (BigDecimal.class.equals(declaredField.getType())) {
declaredField.set(returnObject, BigDecimal.valueOf(cursor.getDouble(columnIndex)));
} else {
declaredField.set(returnObject, cursor.getString(columnIndex));
}
}
}
}
}
private void Disconnect() {
semaphore.release();
}
private void Connect() {
try {
semaphore.acquire();
} catch (InterruptedException e) {
LogHelper.writeExceptionLog(e);
}
}
@Override
public void onCreate(SQLiteDatabase db) {
}
public <T> ArrayList<T> getData(Context context, String tableName, String columnName, String filterCondition, String orderBy,
String groupBy, Class<T> type, SQLiteDatabase database) {
Connect();
ArrayList<T> arrayList = null;
try {
if (context != null && !ValidationHelper.isNullOrEmpty(tableName)) {
SQLiteDatabase db;
if (database == null) {
db = getWritableDatabase();
} else
db = database;
arrayList = new ArrayList<>();
if (db != null) {
StringBuilder selectQuery = new StringBuilder();
selectQuery.append("SELECT ");
if (columnName != null && columnName.length() > 0)
selectQuery.append(columnName);
else
selectQuery.append("*");
selectQuery.append(" FROM ");
selectQuery.append(tableName);
if (!ValidationHelper.isNullOrEmpty(filterCondition)) {
selectQuery.append(" WHERE ");
selectQuery.append(filterCondition);
}
if (!ValidationHelper.isNullOrEmpty(orderBy)) {
selectQuery.append(" ORDER BY ");
selectQuery.append(orderBy);
}
if (!ValidationHelper.isNullOrEmpty(groupBy)) {
selectQuery.append(" GROUP BY ");
selectQuery.append(groupBy);
}
Cursor cursor;
cursor = db.rawQuery(selectQuery.toString(), null);
if (cursor != null) {
String[] cursorColumn = cursor.getColumnNames();
if (cursor.moveToFirst()) {
do {
T returnObject = type.newInstance();
Class<?> returnClass = returnObject.getClass();
if (!returnClass.getSuperclass().equals(Object.class)) {
setFields(cursor, returnObject, returnClass.getSuperclass().getDeclaredFields(), cursorColumn);
}
setFields(cursor, returnObject, returnClass.getDeclaredFields(), cursorColumn);
arrayList.add(returnObject);
} while (cursor.moveToNext());
}
}
}
}
} catch (Exception e) {
LogHelper.writeExceptionLog(e);
} finally {
Disconnect();
}
return arrayList;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
protected void finalize() throws Throwable {
this.close();
super.finalize();
Disconnect();
}
}
public类DatabaseHelper扩展了SQLiteOpenHelper{
私有静态最终字符串数据库\u NAME=“EffiaSoft”;
私有静态最终int数据库_VERSION=1;
私有静态SQLiteOpenHelper;
专用信号量信号量=新信号量(1);
私有上下文mCxt;
/**
*构造函数应该是私有的,以防止直接实例化。
*改为调用静态方法“getInstance()”。
*/
专用DatabaseHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
this.mCxt=上下文;
}
公共静态同步SQLiteOpenHelper getInstance(上下文){
if(sInstance==null){
sInstance=newdatabasehelper(context.getApplicationContext());
}
回归承诺;
}
私有静态void集合字段(游标游标、T returnObject、字段[]declaredFields、字符串[]游标或列)引发IllegaAccessException{
for(字段declaredField:declaredFields){
字符串fieldName=declaredField.getName();
boolean hasColumn=false;
for(字符串列名称:cursorColumns){
if(columnName.equals(fieldName))
hasColumn=true;
其他的
继续;
打破
}
if(has列){
declaredField.setAccessible(true);
int columnIndex=cursor.getColumnIndex(字段名);
如果(列索引>=0){
if(declaredField.getType()==Character.TYPE){
字符串值=cursor.getString(columnIndex);
如果(!ValidationHelper.isNullOrEmpty(value)&&value.length()==1){
字符c=值。字符(0);
declaredField.set(returnObject,c);
}
}else if(declaredField.getType()==Short.TYPE){
set(returnObject,cursor.getShort(columnIndex));
}else if(declaredField.getType()==Integer.TYPE){
set(returnObject,cursor.getInt(columnIndex));
}else if(declaredField.getType()==Long.TYPE){
set(returnObject,cursor.getLong(columnIndex));
}else if(declaredField.getType()==Float.TYPE){
set(returnObject,cursor.getFloat(columnIndex));
}else if(declaredField.getType()==Double.TYPE){
set(returnObject,cursor.getDouble(columnIndex));
}else if(declaredField.getType()==Boolean.TYPE){
String temp=cursor.getString(columnIndex);
declaredField.setBoolean(returnObject,temp.EqualSignalCase(“Y”));
}else if(Date.class.equals(declaredField.getType())){
如果(!ValidationHelper.isNullOrEmpty(cursor.getString(columnIndex))){
日期日期=ValueFormatter.formatDateTime(cursor.getString(columnIndex));
declaredField.set(返回对象,日期);
}
}else if(BigDecimal.class.equals(declaredField.getType())){
declaredField.set(returnObject,BigDecimal.valueOf(cursor.getDouble(columnIndex));
}否则{
set(returnObject,cursor.getString(columnIndex));
}
}
}
}
}
私有无效断开连接(){
semaphore.release();
}
专用void Connect(){
试一试{
semaphore.acquire();
}捕捉(中断异常e){
LogHelper.writeExceptionLog(e);
}
}
@凌驾
public void onCreate(SQLiteDatabase db){
}
公共ArrayList getData(上下文上下文、字符串tableName、字符串columnName、字符串筛选器条件、字符串orderBy、,
字符串groupBy,类类型,SQLiteDatabase){
Connect();
ArrayList ArrayList=null;
试一试{
if(context!=null&!ValidationHelper.isNullOrEmpty(tableName)){
sqlitedb数据库;
if(数据库==null){
db=getWritableDatabase();
}否则
db=数据库;
arrayList=新的arrayList();
如果(db!=null){
StringBuilder selectQuery=新建StringBuilder();
selectQuery.append(“选择”);
if(columnName!=null&&columnName.length()>0)
选择query.append(columnName);
其他的
选择query.append(“*”);
选择query.append(“FROM”);
选择query.append(tableName);
如果(!ValidationHelper.isNullOrEmpty(filterCondition)){
选择query.append(“WHERE”);
选择query.append(过滤条件);
}
如果(!ValidationHelper.isNullOrEmpty(orderBy)){
选择query.append(“订单依据”);
选择query.append(orderBy);
}
如果(!ValidationHelper.isNullOrEmpty(groupBy)){
选择query.append(“分组依据”);
选择query.append(groupBy);
}
光标;
cursor=db.rawQuery(sele
private static DatabaseHelper mInstance = null;
public static DatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new DatabaseHelper(context);
}
return mInstance;
}
DatabaseHelper db = DatabaseHelper.getInstance(context);