Java 这是在android中为SqliteHelper执行singleton的正确方法吗?

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

我试图在android中为SqliteHelper编写一个合适的单例访问。从这里和那里得到了一些零碎的东西来形成最终版本,但不确定我是否遗漏了一些东西

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);