package utils;
import entity.ClassInfo;
import java.io.File;
import java.lang.reflect.Field;
import java.util.List;
public class DbUtils {
public static void main(String[] args) {
genDbCode();
}
private static void genDbCode() {
List<File> entityFiles = FileUtils.getAllFiles(new File(
"temp" + File.separator + "db" + File.separator + "entities"));
for (File file : entityFiles) {
ClassInfo info = ClassUtils.readClassInfo(file);
genColumnCode(info);
genTableCode(info);
genCURDCode(info);
}
}
private static void genTableCode(ClassInfo info) {
StringBuilder sbTable = new StringBuilder();
sbTable.append(StringUtils.formatSingleLine(0, "String sql = \"CREATE TABLE IF NOT EXISTS \""));
sbTable.append(StringUtils.formatSingleLine(2,
"+ DataModel." + info.className + ".TABLE_NAME + \"(\""));
if (getPrimaryKey(info) == null) {
sbTable.append(StringUtils.formatSingleLine(2,
"+ DataModel." + info.className + "._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT,\""));
}
for (ClassInfo.ClassField field : info.fields) {
String name = getColumnString(field);
String type = ClassUtils.parsePri2DBType(field);
if (field.isPrimaryKey) {
type += " PRIMARY KEY";
}
sbTable.append(StringUtils.formatSingleLine(2,
"+ DataModel." + info.className + "." + name + " + \" " + type + ",\""));
}
sbTable.replace(sbTable.lastIndexOf(",\""), sbTable.lastIndexOf(",\"") + 2, "\"\n\t\t+ \")\";");
System.out.println(sbTable.toString());
}
private static ClassInfo.ClassField getPrimaryKey(ClassInfo info) {
for (ClassInfo.ClassField field : info.fields) {
if (field.isPrimaryKey) {
return field;
}
}
return null;
}
private static void genColumnCode(ClassInfo info) {
StringBuilder sbColumn = new StringBuilder();
sbColumn.append(StringUtils.formatSingleLine(0,
"public interface " + info.className + " extends BaseColumns {"));
sbColumn.append(StringUtils.formatSingleLine(1,
formatString("TABLE_NAME", StringUtils.camelTo_(info.className))));
for (ClassInfo.ClassField field : info.fields) {
String name = getColumnString(field);
String value = getColumnString(field).toLowerCase();
sbColumn.append(StringUtils.formatSingleLine(1, formatString(name, value)));
}
System.out.println(sbColumn.toString());
}
private static String formatString(String name, String value) {
String str = "String %s = \"%s\";";
return String.format(str, name, value);
}
private static void genCURDCode(ClassInfo info) {
// get content value
StringBuilder sbContentValue = new StringBuilder();
sbContentValue.append(StringUtils.formatSingleLine(1,
"private ContentValues getContentValues(" + info.className + " data) {"));
sbContentValue.append(StringUtils.formatSingleLine(2,
"ContentValues value = new ContentValues();"));
for (ClassInfo.ClassField field : info.fields) {
String name = getColumnString(field);
sbContentValue.append(StringUtils.formatSingleLine(2,
"value.put(DataModel." + info.className + "." + name + ", " + getDataGetMethod(field) + ");"));
}
sbContentValue.append(StringUtils.formatSingleLine(2, "return value;"));
sbContentValue.append(StringUtils.formatSingleLine(1, "}"));
System.out.println(sbContentValue.toString());
// add
StringBuilder sbAdd = new StringBuilder();
sbAdd.append(StringUtils.formatSingleLine(1,
"public void add" + info.className + "(" + info.className + " data) {"));
sbAdd.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getWritableDatabase();"));
sbAdd.append("\n");
sbAdd.append(StringUtils.formatSingleLine(2,
"ContentValues value = getContentValues(data);"));
sbAdd.append(StringUtils.formatSingleLine(2,
"db.insert(DataModel." + info.className + ".TABLE_NAME, null, value);"));
sbAdd.append(StringUtils.formatSingleLine(1, "}"));
System.out.println(sbAdd.toString());
ClassInfo.ClassField primaryKeyField = getPrimaryKey(info);
if (primaryKeyField != null) {
// 有自定义主键,才提供更新方法
// update
StringBuilder sbUpdate = new StringBuilder();
sbUpdate.append(StringUtils.formatSingleLine(1,
"public void update" + info.className + "(" + info.className + " data) {"));
sbUpdate.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getWritableDatabase();"));
sbUpdate.append("\n");
sbUpdate.append(StringUtils.formatSingleLine(2,
"ContentValues value = getContentValues(data);"));
sbUpdate.append(StringUtils.formatSingleLine(2,
"db.update(DataModel." + info.className + ".TABLE_NAME,"));
sbUpdate.append(StringUtils.formatSingleLine(4, "value,"));
sbUpdate.append(StringUtils.formatSingleLine(4,
"DataModel." + info.className + "." + getColumnString(primaryKeyField) + " + \"=?\","));
sbUpdate.append(StringUtils.formatSingleLine(4,
"new String[]{" + valueOfGet(primaryKeyField, "data." + primaryKeyField.getGetMethod()) + "});"));
sbUpdate.append(StringUtils.formatSingleLine(1, "}"));
System.out.println(sbUpdate.toString());
// add or update
StringBuilder sbAddOrUpdate = new StringBuilder();
sbAddOrUpdate.append(StringUtils.formatSingleLine(1,
"public void addOrUpdate" + info.className + "(" + info.className + " data) {"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(2,
"if(get" + info.className + "(data." + primaryKeyField.getGetMethod() + ") != null) {"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(3,
"update" + info.className + "(data);"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(2,
"} else {"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(3,
"add" + info.className + "(data);"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(2, "}"));
sbAddOrUpdate.append(StringUtils.formatSingleLine(1, "}"));
System.out.println(sbAddOrUpdate.toString());
}
// add data list
StringBuilder sbAddList = new StringBuilder();
sbAddList.append(StringUtils.formatSingleLine(1,
"public void add" + info.className + "List(ArrayList<" + info.className + "> datas) {"));
sbAddList.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getWritableDatabase();"));
sbAddList.append("\n");
sbAddList.append(StringUtils.formatSingleLine(2,
"db.beginTransaction();"));
sbAddList.append("\n");
sbAddList.append(StringUtils.formatSingleLine(2,
"String sql = \"INSERT INTO \" + DataModel." + info.className + ".TABLE_NAME +"));
StringBuilder sbValue = new StringBuilder();
sbValue.append("\" VALUES (");
for (int i = 0; i < info.fields.size(); i++) {
ClassInfo.ClassField field = info.fields.get(i);
if (i == info.fields.size() - 1) {
sbAdd.append(StringUtils.formatSingleLine(4,
"+ DataModel." + info.className + "." + getColumnString(field) + " + \") \""));
sbValue.append("?)\";");
} else {
// TODO: 2016/11/19 要考虑哪些字段要剔除
sbAdd.append(StringUtils.formatSingleLine(4,
"+ DataModel." + info.className + "." + getColumnString(field) + " + \", \""));
sbValue.append("?, ");
}
}
sbAddList.append(StringUtils.formatSingleLine(4, sbValue.toString()));
sbAddList.append(StringUtils.formatSingleLine(2,
"SQLiteStatement stmt = db.compileStatement(sql);"));
sbAddList.append("\n");
sbAddList.append(StringUtils.formatSingleLine(2, "// 事务批处理"));
sbAddList.append(StringUtils.formatSingleLine(2, "for (" + info.className + " data : datas) {"));
for (int i = 0; i < info.fields.size(); i++) {
ClassInfo.ClassField field = info.fields.get(i);
String bindMethod;
switch (ClassUtils.parsePri2DBType(field)) {
case "INTEGER":
bindMethod = "bindLong";
break;
case "REAL":
bindMethod = "bindDouble";
break;
case "TEXT":
default:
bindMethod = "bindString";
break;
}
// TODO: 2016/11/19 有index的存在,要考虑哪些字段要剔除
sbAddList.append(StringUtils.formatSingleLine(3,
"stmt." + bindMethod + "(" + (i + 1) + ", " + getDataGetMethod(field) + ");"));
}
sbAddList.append(StringUtils.formatSingleLine(3,
"stmt.execute();"));
sbAddList.append(StringUtils.formatSingleLine(3,
"stmt.clearBindings();"));
sbAddList.append(StringUtils.formatSingleLine(2,
"}"));
sbAddList.append("\n");
sbAddList.append(StringUtils.formatSingleLine(2,
"db.setTransactionSuccessful();"));
sbAddList.append(StringUtils.formatSingleLine(2,
"db.endTransaction();"));
sbAddList.append(StringUtils.formatSingleLine(1,
"}"));
System.out.println(sbAddList.toString());
if (primaryKeyField != null) {
// 有自定义主键,才提供根据主键获取对象方法
// get data
StringBuilder sbGet = new StringBuilder();
sbGet.append(StringUtils.formatSingleLine(1, "public " + info.className +
" get" + info.className + "(" + primaryKeyField.type + " key) {"));
sbGet.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getReadableDatabase();"));
sbGet.append(StringUtils.formatSingleLine(2,
info.className + " data = null;"));
sbGet.append(StringUtils.formatSingleLine(2,
"Cursor cursor = null;"));
sbGet.append(StringUtils.formatSingleLine(2,
"try {"));
sbGet.append(StringUtils.formatSingleLine(3,
"cursor = db.query(DataModel." + info.className + ".TABLE_NAME,"));
sbGet.append(StringUtils.formatSingleLine(5,
"null,"));
sbGet.append(StringUtils.formatSingleLine(5,
"DataModel." + info.className + "." + getColumnString(primaryKeyField) + " + \"=?\","));
sbGet.append(StringUtils.formatSingleLine(5,
"new String[]{" + valueOfGet(primaryKeyField, "key") + "},"));
sbGet.append(StringUtils.formatSingleLine(5,
"null,"));
sbGet.append(StringUtils.formatSingleLine(5,
"null,"));
sbGet.append(StringUtils.formatSingleLine(5,
"null);"));
sbGet.append(StringUtils.formatSingleLine(3,
"if (cursor != null && cursor.moveToFirst()) {"));
sbGet.append(StringUtils.formatSingleLine(4,
"data = new " + info.className + "();"));
sbGet.append(getDbSetDataStr(info, 4));
sbGet.append(StringUtils.formatSingleLine(3,
"}"));
sbGet.append(StringUtils.formatSingleLine(2,
"} finally {"));
sbGet.append(StringUtils.formatSingleLine(3,
"if (cursor != null) cursor.close();"));
sbGet.append(StringUtils.formatSingleLine(2,
"}"));
sbGet.append(StringUtils.formatSingleLine(2,
"return data;"));
sbGet.append(StringUtils.formatSingleLine(1,
"}"));
System.out.println(sbGet.toString());
}
// TODO get data list
StringBuilder sbGetList = new StringBuilder();
sbGetList.append(StringUtils.formatSingleLine(1,
"public ArrayList<" + info.className + "> get" + info.className + "List() {"));
sbGetList.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getReadableDatabase();"));
sbGetList.append(StringUtils.formatSingleLine(2,
"ArrayList<" + info.className + "> datas = new ArrayList<>();"));
sbGetList.append(StringUtils.formatSingleLine(2,
"Cursor cursor = null;"));
sbGetList.append(StringUtils.formatSingleLine(2,
"try {"));
sbGetList.append(StringUtils.formatSingleLine(3,
"cursor = db.query(DataModel." + info.className + ".TABLE_NAME,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null,"));
sbGetList.append(StringUtils.formatSingleLine(5,
"null);"));
sbGetList.append(StringUtils.formatSingleLine(3,
"if (cursor != null && cursor.moveToFirst()) {"));
sbGetList.append(StringUtils.formatSingleLine(4,
"do {"));
sbGetList.append(StringUtils.formatSingleLine(5,
info.className + " data = new " + info.className + "();"));
sbGetList.append(getDbSetDataStr(info, 5));
sbGetList.append(StringUtils.formatSingleLine(5,
"datas.add(data);"));
sbGetList.append(StringUtils.formatSingleLine(4,
"} while (cursor.moveToNext());"));
sbGetList.append(StringUtils.formatSingleLine(3,
"}"));
sbGetList.append(StringUtils.formatSingleLine(2,
"} finally {"));
sbGetList.append(StringUtils.formatSingleLine(3,
"if (cursor != null) cursor.close();"));
sbGetList.append(StringUtils.formatSingleLine(2,
"}"));
sbGetList.append(StringUtils.formatSingleLine(2,
"return datas;"));
sbGetList.append(StringUtils.formatSingleLine(1,
"}"));
System.out.println(sbGetList.toString());
if (primaryKeyField != null) {
// 有自定义主键,才提供根据主键删除对象方法
// delete data
StringBuilder sbDelete = new StringBuilder();
sbDelete.append(StringUtils.formatSingleLine(1,
"public void delete" + info.className + "(" + info.className + " data) {"));
sbDelete.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getWritableDatabase();"));
sbDelete.append(StringUtils.formatSingleLine(2,
"db.delete(DataModel." + info.className + ".TABLE_NAME,"));
sbDelete.append(StringUtils.formatSingleLine(4,
"DataModel." + info.className + "." + getColumnString(primaryKeyField) + " + \"=?\","));
sbDelete.append(StringUtils.formatSingleLine(4,
"new String[]{" + valueOfGet(primaryKeyField, "data." + primaryKeyField.getGetMethod()) + "});"));
sbDelete.append(StringUtils.formatSingleLine(1,
"}"));
System.out.println(sbDelete.toString());
}
// delete data list
StringBuilder sbDeleteList = new StringBuilder();
sbDeleteList.append(StringUtils.formatSingleLine(1, "public void delete" + info.className + "List() {"));
sbDeleteList.append(StringUtils.formatSingleLine(2,
"SQLiteDatabase db = helper.getWritableDatabase();"));
sbDeleteList.append(StringUtils.formatSingleLine(2,
"db.delete(DataModel." + info.className + ".TABLE_NAME, null, null);"));
sbDeleteList.append(StringUtils.formatSingleLine(1,
"}"));
System.out.println(sbDeleteList.toString());
}
private static String getDbSetDataStr(ClassInfo info, int tableNum) {
StringBuilder sbDbSetDataStr = new StringBuilder();
for (int i = 0; i < info.fields.size(); i++) {
ClassInfo.ClassField field = info.fields.get(i);
String cursorGetStr;
switch (field.type) {
case "int":
case "Integer":
cursorGetStr = "cursor.getInt(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + "))";
break;
case "long":
case "Long":
cursorGetStr = "cursor.getLong(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + "))";
break;
case "float":
case "Float":
cursorGetStr = "cursor.getFloat(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + "))";
break;
case "double":
case "Double":
cursorGetStr = "cursor.getDouble(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + "))";
break;
case "boolean":
case "Boolean":
cursorGetStr = "cursor.getInt(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + ")) == 1";
break;
case "String":
default:
cursorGetStr = "cursor.getString(cursor.getColumnIndex(DataModel."
+ info.className + "." + getColumnString(field) + "))";
break;
}
sbDbSetDataStr.append(StringUtils.formatSingleLine(tableNum,
"data." + String.format(field.getSetMethod(), cursorGetStr) + ";"));
}
return sbDbSetDataStr.toString();
}
private static String getDataGetMethod(ClassInfo.ClassField field) {
String value = "data." + field.getGetMethod();
if (field.type.equals("boolean") || field.type.equals("Boolean")) {
value += " ? 1 : 0";
}
return value;
}
private static String getColumnString(ClassInfo.ClassField field) {
return StringUtils.camelTo_(field.name).toUpperCase();
}
private static String valueOfGet(ClassInfo.ClassField field, String value) {
if(field.type.equals("String")) {
return value;
} else {
return "String.valueOf(" + value + ")";
}
}
}