SQLiteDatabase and ReentrantLock
//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<String, Database> databases = new HashMap<String, Database>();
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<Object> rlt = new ArrayList<Object>();
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);
}
}
Related examples in the same category