package com.heyi.data;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import com.heyi.utils.NameUtil;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
*
* @author Neo
*
*/
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "test.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
// CursorFactory set to null, use the default values
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* The database is created for the first time the onCreate will be invoked
*/
@Override
public void onCreate(SQLiteDatabase db) {
String tableBuffer2 = createTable(User.class);
db.execSQL(tableBuffer2);
}
/**
* Create table by class.
*
* @param clazz
* the model class.
* @return SQL string.
*/
private String createTable(Class<?> clazz) {
StringBuffer tableBuffer = new StringBuffer(
"CREATE TABLE IF NOT EXISTS ");
// Table name.
tableBuffer.append(NameUtil.camel4underline(clazz.getSimpleName()));
tableBuffer.append("(");
// Other field.
Field[] fieldlist = clazz.getDeclaredFields();
for (int i = 0; i < fieldlist.length; i++) {
Field fld = fieldlist[i];
tableBuffer.append(NameUtil.camel4underline(fld.getName()));
tableBuffer.append(" ");
if (fld.getType() == int.class) {
tableBuffer.append("INTEGER");
} else if (fld.getType() == String.class) {
tableBuffer.append("TEXT");
} else if (fld.getType() == Double.class
|| fld.getType() == Float.class) {
tableBuffer.append("REAL");
}
tableBuffer.append(", ");
}
tableBuffer.delete(tableBuffer.length() - 2, tableBuffer.length());
tableBuffer.append(")");
return tableBuffer.toString();
}
/**
* If the DATABASE_VERSION value is changed to 2, the system found an
* existing database version, namely onUpgrade will call
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
}
/**
* Add a new Object.
*
* @param obj
* @param db
*/
public void add(Object obj, SQLiteDatabase db) {
try {
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("INSERT INTO ");
sqlBuffer.append(NameUtil.camel4underline(obj.getClass()
.getSimpleName()));
sqlBuffer.append("(");
Field[] fieldlist = obj.getClass().getDeclaredFields();
StringBuffer vals = new StringBuffer(" VALUES(");
Object[] objs = new Object[fieldlist.length];
for (int i = 0; i < fieldlist.length; i++) {
Field fld = fieldlist[i];
sqlBuffer.append(NameUtil.camel4underline(fld.getName()));
sqlBuffer.append(", ");
vals.append("?, ");
fld.setAccessible(true);
objs[i] = fld.get(obj);
}
sqlBuffer.delete(sqlBuffer.length() - 2, sqlBuffer.length());
sqlBuffer.append(")");
vals.delete(vals.length() - 2, vals.length());
vals.append(")");
sqlBuffer.append(vals);
db.beginTransaction();
db.execSQL(sqlBuffer.toString(), objs);
db.setTransactionSuccessful();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
if (db.inTransaction()) {
db.endTransaction();
}
}
}
/**
* Delete object by ID.
*
* @param obj
* @param db
*/
public void delete(Object obj, SQLiteDatabase db) {
try {
Field IDField = obj.getClass().getDeclaredField("id");
IDField.setAccessible(true);
String id = (String) IDField.get(obj);
String sql = "DELETE FROM "
+ NameUtil.camel4underline(obj.getClass().getSimpleName())
+ " WHERE id='" + id + "'";
db.execSQL(sql);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* Update a Object by ID.
*
* @param obj
* @param db
*/
public void update(Object obj, SQLiteDatabase db) {
try {
Field IDField = obj.getClass().getDeclaredField("id");
IDField.setAccessible(true);
String id = (String) IDField.get(obj);
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("UPDATE ");
sqlBuffer.append(NameUtil.camel4underline(obj.getClass()
.getSimpleName()));
sqlBuffer.append(" SET ");
Field[] fieldlist = obj.getClass().getDeclaredFields();
for (int i = 0; i < fieldlist.length; i++) {
Field fld = fieldlist[i];
fld.setAccessible(true);
sqlBuffer.append(NameUtil.camel4underline(fld.getName()));
sqlBuffer.append("='");
sqlBuffer.append(fld.get(obj));
sqlBuffer.append("',");
}
sqlBuffer.deleteCharAt(sqlBuffer.length() - 1);
sqlBuffer.append(" WHERE id='");
sqlBuffer.append(id);
sqlBuffer.append("'");
db.execSQL(sqlBuffer.toString());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} finally {
}
}
/**
* Get Object by ID.
*
* @param clazz
* @param db
* @param _id
* @return
*/
public Object get(Class<?> clazz, SQLiteDatabase db, String id) {
Cursor c = db.rawQuery(
"SELECT * FROM "
+ NameUtil.camel4underline(clazz.getSimpleName())
+ " WHERE id=?", new String[] { id });
try {
if (c != null && c.moveToFirst()) {
return cursor2Obj(clazz, c);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
return null;
}
/**
* Get all object for the class.
*
* @param clazz
* class type.
* @param db
* SQLiteDatabase.
* @return all object.
*/
public List<Object> getAll(Class<?> clazz, SQLiteDatabase db) {
List<Object> list = new ArrayList<Object>();
Cursor c = db
.rawQuery(
"SELECT * FROM "
+ NameUtil.camel4underline(clazz
.getSimpleName()), null);
try {
while (c != null && c.moveToNext()) {
list.add(cursor2Obj(clazz, c));
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
return list;
}
/**
* Convert cursor to Object.
*
* @param clazz
* @param c
* @return
* @throws InstantiationException
* @throws IllegalAccessException
* @throws NoSuchFieldException
*/
private Object cursor2Obj(Class<?> clazz, Cursor c)
throws InstantiationException, IllegalAccessException,
NoSuchFieldException {
String[] columnNames = c.getColumnNames();
Object obj = clazz.newInstance();
for (int i = 0; i < columnNames.length; i++) {
String columnName = columnNames[i];
int columnIndex = c.getColumnIndex(columnName);
Field field = clazz.getDeclaredField(NameUtil
.underline4camel(columnName));
field.setAccessible(true);
Object val = null;
int type = c.getType(columnIndex);
switch (type) {
case Cursor.FIELD_TYPE_BLOB:
break;
case Cursor.FIELD_TYPE_FLOAT:
val = c.getDouble(columnIndex);
break;
case Cursor.FIELD_TYPE_INTEGER:
val = c.getInt(columnIndex);
break;
case Cursor.FIELD_TYPE_NULL:
break;
case Cursor.FIELD_TYPE_STRING:
val = c.getString(columnIndex);
break;
default:
break;
}
field.set(obj, val);
}
return obj;
}
}
User.java类
package com.heyi.data;
import com.heyi.utils.ClassUtil;
public class User {
private String id;
private String name;
private Double score;
private int level;
private String qqEmail;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
public String toString() {
return ClassUtil.printObject(this);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getQqEmail() {
return qqEmail;
}
public void setQqEmail(String qqEmail) {
this.qqEmail = qqEmail;
}
}
ClassUtil.java
package com.heyi.utils;
import java.lang.reflect.Field;
public class ClassUtil {
public static String printObject(Object obj){
try {
StringBuffer buffer = new StringBuffer();
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
buffer.append(field.getName());
buffer.append(":");
buffer.append(field.get(obj));
buffer.append(" ");
}
return buffer.toString();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}