package org.aisen.wen.component.orm.utils;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import org.aisen.wen.component.orm.SqliteUtility;
import org.aisen.wen.component.orm.annotation.TableName;
import org.aisen.wen.component.orm.extra.TableColumn;
import org.aisen.wen.component.orm.extra.TableInfo;
import org.aisen.wen.support.utils.Logger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TableInfoUtils {
public static final String TAG = SqliteUtility.TAG;
private static final HashMap<String, TableInfo> tableInfoMap;
static {
tableInfoMap = new HashMap<String, TableInfo>();
}
public static <T> TableInfo exist(String dbName, Class<T> clazz) {
return tableInfoMap.get(dbName + "-" + getTableName(clazz));
}
/**
* 当没有注解的时候默认用类的名称作为表名,并把点(.)替换为下划线(_)
*
* @param clazz
* @return
*/
public static String getTableName(Class<?> clazz) {
TableName table = clazz.getAnnotation(TableName.class);
if (table == null || table.table().trim().length() == 0) {
return clazz.getName().replace('.', '_');
}
return table.table();
}
public static <T> TableInfo newTable(String dbName, SQLiteDatabase db, Class<T> clazz) {
Cursor cursor = null;
TableInfo tableInfo = new TableInfo(clazz);
tableInfoMap.put(dbName + "-" + getTableName(clazz), tableInfo);
try {
// 检查表是否存在
String sql = "SELECT COUNT(*) AS c FROM sqlite_master WHERE type ='table' AND name ='" + tableInfo.getTableName() + "' ";
cursor = db.rawQuery(sql, null);
if (cursor != null && cursor.moveToNext()) {
int count = cursor.getInt(0);
if (count > 0) {
cursor.close();
Logger.d(TAG, "表 %s 已存在", tableInfo.getTableName());
cursor = db.rawQuery("PRAGMA table_info" + "(" + tableInfo.getTableName() + ")", null);
// table的所有字段名称
List<String> tableColumns = new ArrayList<String>();
if (cursor != null && cursor.moveToNext()) {
do {
tableColumns.add(cursor.getString(cursor.getColumnIndex("name")));
} while (cursor.moveToNext());
}
cursor.close();
// 检查新对象的是否更新
List<String> properList = new ArrayList<String>();
for (TableColumn column : tableInfo.getColumns()) {
properList.add(column.getColumn());
}
// 如果有新增字段,自动添加,暂时不能删除字段
List<String> newFieldList = new ArrayList<String>();
for (String field : properList) {
if (tableInfo.getPrimaryKey().equals(field))
continue;
boolean isNew = true;
for (String tableColumn : tableColumns) {
if (tableColumn.equals(field)) {
isNew = false;
break;
}
}
if (isNew)
newFieldList.add(field);
}
for (String newField : newFieldList) {
db.execSQL(String.format("ALTER TABLE %s ADD %s TEXT", tableInfo.getTableName(), newField));
Logger.d(TAG, "表 %s 新增字段 %s", tableInfo.getTableName(), newField);
}
return tableInfo;
}
}
// 创建一张新的表
String createSql = SqlUtils.getTableSql(tableInfo);
db.execSQL(createSql);
Logger.d(TAG, "创建一张新表 %s", tableInfo.getTableName());
} catch (Exception e) {
e.printStackTrace();
Logger.d(TAG, e.getMessage() + "");
} finally {
if (cursor != null)
cursor.close();
cursor = null;
}
return tableInfo;
}
}