Database Android

//package com.softright.db;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class Database {
  private final ReentrantLock lock = new ReentrantLock();
  private static final int LONG = 3327612;
  private static final int INT = 104431;
  private static final int STRING = 1195259493;
  private static final int INTEGER = -2056817302;
  private static final int LONG_CLZ = 398795216;
  private SQLiteDatabase sqlLite;
  
  private static final Map databases = new HashMap();
  public static Database getInstance(String name,Context context) {
    Database rlt = databases.get(name);
    if (rlt == null)
      return new Database(name,context);
    else
      return rlt;
  }
  
  
  private Database(String name,Context context) {
    sqlLite = context.openOrCreateDatabase(name + ".db", Context.MODE_WORLD_WRITEABLE, null);
    databases.put(name, this);
  }
  public void begin() {
    sqlLite.beginTransaction();
    lock.lock();
  }
  public void commit() {
    sqlLite.setTransactionSuccessful();
    sqlLite.endTransaction();
  }
  public void rollback() {
    sqlLite.endTransaction();
    
  }
  public void close() {
    lock.unlock();
  }
  @SuppressWarnings("unchecked")
  public void checkTable(Class clz) {
    Field[] fields = clz.getFields();
    StringBuffer sql = new StringBuffer();
    sql.append("create table IF NOT EXISTS ");
    sql.append(getTableName(clz));
    sql.append("(");
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      if (this.isFieldValid(field.getType().getName())) {
        sql.append(field.getName());
        sql.append(",");
      }
    }
    sql.setCharAt(sql.length() - 1, ')');
    Log.d("DB", sql.toString());
    sqlLite.execSQL(sql.toString());
  }
  public boolean exist(Object obj, String where) {
    StringBuffer sql = new StringBuffer();
    sql.append("select count(0) from ");
    sql.append(getTableName(obj.getClass()));
    sql.append(" where ");
    sql.append(where);
    
    Cursor cursor = sqlLite.rawQuery(sql.toString(), null);
    if (cursor.moveToFirst())
      return cursor.getInt(0) > 0;
    else
      return false;
  }
  @SuppressWarnings("unchecked")
  public int count(Class clz, String where) {
    StringBuffer sql = new StringBuffer();
    sql.append("select count(0) from ");
    sql.append(getTableName(clz));
    if (where != null) {
      sql.append(" where ");
      sql.append(where);
    }
    Cursor cursor = sqlLite.rawQuery(sql.toString(), null);
    if (cursor.moveToFirst())
      return cursor.getInt(0);
    else
      return 0;
  }
  public int insert(Object object) {
    ContentValues values = new ContentValues();
    Field[] fields = object.getClass().getFields();
    String where = "";
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        if (field.get(object) != null) {
          boolean pk = field.getName().equalsIgnoreCase("localId");
          switch (field.getType().getName().hashCode()) {
          case STRING:// string
            values.put(field.getName(), field.get(object).toString());
            if (pk)
              where = field.getName() + "='" + field.get(object).toString() + "'";
            break;
          case LONG:// long
          case LONG_CLZ:
            values.put(field.getName(), field.getLong(object));
            if (pk)
              where = field.getName() + "=" + field.getLong(object);
            break;
          case INT:// integer
          case INTEGER:
            values.put(field.getName(), field.getInt(object));
            if (pk)
              where = field.getName() + "=" + field.getInt(object);
          }
          if (pk && this.exist(object, where)) {
            return this.save(object);
          }
        }
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
    return (int) sqlLite.insert(getTableName(object.getClass()), "", values);
    
  }
  public int save(Object object) {
    ContentValues values = new ContentValues();
    Field[] fields = object.getClass().getFields();
    String where = "";
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        if (field.getName().equalsIgnoreCase("localId")) {
          where = field.getName() + "=";
          switch (field.getType().getName().hashCode()) {
          case STRING:// string
            where += "'" + field.get(object).toString() + "'";
            break;
          case LONG:// long
          case LONG_CLZ:
          case INT:// integer
          case INTEGER:
            where += field.get(object).toString();
            break;
          }
        } else {
          Object value = field.get(object);
          if (value != null) {
            switch (field.getType().getName().hashCode()) {
            case STRING:// string
              values.put(field.getName(), value.toString());
              break;
            case LONG:// long
            case LONG_CLZ:
              values.put(field.getName(), (Long) value);
              break;
            case INT:// integer
            case INTEGER:
              values.put(field.getName(), (Integer) value);
            }
          }
        }
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
    Log.d("DB","db update:"+object.getClass().getName()+" "+where);
    if(object.getClass().getName().equals("com.softright.db.ContactBase"))
    {
    }
    return (int) sqlLite.update(getTableName(object.getClass()), values, where, null);
  }
  @SuppressWarnings("unchecked")
  private Object readCursor(Class clz, Cursor cursor, Map map) throws Exception {
    Object result = clz.newInstance();
    Field[] fields = clz.getFields();
    Object key = null;
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        int columIndex = cursor.getColumnIndex(field.getName());
        if (columIndex < 0)
          continue;
        Object value = null;
        switch (field.getType().getName().hashCode()) {
        case STRING:// string
          value = cursor.getString(columIndex);
          field.set(result, cursor.getString(columIndex));
          break;
        case LONG:// long
        case LONG_CLZ:
          value = cursor.getLong(columIndex);
          field.set(result, cursor.getLong(columIndex));
          break;
        case INT:// integer
        case INTEGER:
          value = cursor.getInt(columIndex);
          field.set(result, cursor.getInt(columIndex));
          break;
        }
        if (field.getName().equalsIgnoreCase("localId") && map != null) {
          key = value;
        }
      } catch (Exception e) {
        Log.d("database", "database readcursor failed!");
        e.printStackTrace();
      }
    }
    if (map != null)
      map.put(key, result);
    return result;
  }
  private boolean isFieldValid(String name) {
    switch (name.hashCode()) {
    case STRING:
    case INT:
    case LONG:
    case INTEGER:
    case LONG_CLZ:
      return true;
    default:
      return false;
    }
  }
  @SuppressWarnings("unchecked")
  private String getTableName(Class clz)
  {
    return clz.getSimpleName();
  }
  
  @SuppressWarnings("unchecked")
  public List search(Class clz, String where, String[] args, int start, int maxResult, Map map) {
    StringBuffer query = new StringBuffer();
    query.append("select ");
    Field[] fields = clz.getFields();
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        if (isFieldValid(field.getType().getName())) {
          query.append(field.getName());
          query.append(",");
        }
      } catch (Exception e) {
        Log.d("NET", "net7");
        e.printStackTrace();
      }
    }
    query.setCharAt(query.length() - 1, ' ');
    query.append(" from ");
    query.append(getTableName(clz));
    if (where != null) {
      query.append(" where ");
      query.append(where);
    }
    Log.d("DB", "Search:"+query.toString());
    Cursor cursor = sqlLite.rawQuery(query.toString(), args);
    List rlt = new ArrayList();
    int index = 0;
    if (cursor.moveToFirst()) {
      if (start > 0) {
        if (!cursor.move(start))
          return rlt;
      }
      do {
        try {
          rlt.add(this.readCursor(clz, cursor, map));
          index++;
        } catch (Exception e) {
          Log.d("NET", "net6");
          e.printStackTrace();
        }
        if ((index) >= maxResult) {
          break;
        }
      } while (cursor.moveToNext());
    }
    
    return rlt;
  }
  @SuppressWarnings("unused")
  public Object locate(Object pk, Class clz) {
    Field[] fields = clz.getFields();
    String where = "";
    String[] id = null;
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        if (field.getName().equalsIgnoreCase("localId")) {
          switch (field.getType().getName().hashCode()) {
          case STRING:
            where = field.getName() + "=?";
            id = new String[] { pk.toString() };
            break;
          default:
            where = field.getName() + "=" + pk.toString();
            break;
          }
          break;
        }
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      }
    }
    List rlt = this.search(clz, where, null, 0, 1, null);
    if (rlt.size() > 0)
      return rlt.get(0);
    else
      return null;
  }
  public Object locate(Class clz, String where) {
    List rlt = this.search(clz, where, null, 0, 1, null);
    if (rlt.size() > 0)
      return rlt.get(0);
    else
      return null;
  }
  public int delete(Object object) {
    Field[] fields = object.getClass().getFields();
    String where = "";
    String[] id = new String[1];
    for (int i = 0; i < fields.length; i++) {
      Field field = fields[i];
      try {
        if (field.getName().equalsIgnoreCase("localId")) {
          where = field.getName() + "=?";
          id[0] = field.get(object).toString();
          break;
        }
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
    return (int) sqlLite.delete(getTableName(object.getClass()), where, id);
  }
}