overview:只需傳入一個bean對象,即可完成數據庫相關操作。(本文字段數據類型只取了簡單兩種,如有需要,請在對應地方添加。不會的,@我。thanks)
public class DbUtils<T> {
private static final String DB_NAME = "student";
private static final String TYPE_INT = "int";
private static final String TYPE_STRING = "String";
private static final String DB_FLOAT = "student";
private static final String DB_BOOLEAN = "student";
private static final String TABLE_ID = "id";
private static final int DB_VERSION = 1;
private String tableName;
private Context context;
private Class cls;
private SQLiteDatabase db;
private final Field[] fs;
public DbUtils(Context context, T table) {
SQLiteHelper helper = new SQLiteHelper(context, DB_NAME, null, DB_VERSION);
db = helper.getReadableDatabase();
cls = table.getClass();
tableName = cls.getSimpleName();
fs = cls.getDeclaredFields();
this.context = context;
newTable();
}
public void newTable() {
String sql = "create table if not exists " + tableName + "(";
if (!contain(fs, TABLE_ID)) {
sql += TABLE_ID + " integer primary key autoincrement";
}
for (int i = 0; i < fs.length; i++) {
if (fs[i].getName().equals(TABLE_ID)) {
sql += TABLE_ID + " integer primary key autoincrement";
continue;
}
switch (fs[i].getType().getSimpleName()) {
case TYPE_INT:
sql += "," + fs[i].getName() + " integer";
break;
case TYPE_STRING:
sql += "," + fs[i].getName() + " text";
break;
}
}
sql += ")";
db.execSQL(sql);
}
public void insert(T obj) {
db.insert(tableName, insertColumns(), insertValues(obj));
ToastUtils.simpleToast(context, "插入成功");
}
public void delete(int id) {
db.delete(tableName, "id=?", new String[]{String.valueOf(id)});
ToastUtils.simpleToast(context, "刪除成功");
}
public void update(T obj, int id) {
db.update(tableName, insertValues(obj), "id=?", new String[]{String.valueOf(id)});
ToastUtils.simpleToast(context, "修改成功");
}
public T queryById(int id) {
T result = null;
Cursor cursor = db.query(tableName, null, "id=?", new String[]{String.valueOf(id)}, null, null, null);
while (cursor.moveToNext()) {
try {
result = (T) cls.newInstance();
setValues(result, cursor);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return result;
}
public ArrayList<T> queryAll() {
ArrayList<T> results = new ArrayList<>();
T res = null;
Cursor cursor = db.query(tableName, null, null, null, null, null, null);
while (cursor.moveToNext()) {
try {
res = (T) cls.newInstance();
setValues(res, cursor);
results.add(res);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return results;
}
public void close() {
db.close();
}
private void setValues(T result, Cursor cursor) throws IllegalAccessException {
for (Field f : fs) {
f.setAccessible(true);
switch (f.getType().getSimpleName()) {
case TYPE_INT:
f.setInt(result, cursor.getInt(cursor.getColumnIndex(f.getName())));
break;
case TYPE_STRING:
f.set(result, cursor.getString(cursor.getColumnIndex(f.getName())));
break;
}
}
}
private ContentValues insertValues(T obj) {
ContentValues values = new ContentValues();
for (Field f : fs) {
try {
f.setAccessible(true);
switch (f.getType().getSimpleName()) {
case TYPE_INT:
values.put(f.getName(), Integer.parseInt(f.get(obj).toString()));
break;
case TYPE_STRING:
values.put(f.getName(), f.get(obj).toString());
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return values;
}
private String insertColumns() {
String ins = "";
for (int i = 0; i < fs.length; i++) {
ins += "," + fs[i].getName();
}
return ins.substring(1,ins.length());
}
private boolean contain(Field[] tableInfo, String tableId) {
for (int i = 0; i < tableInfo.length; i++) {
if (tableInfo[i].getName().equals(tableId)) return true;
}
return false;
}
private class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}