SQLite反射封装
来源:互联网 发布:安卓e4a编程工具手机版 编辑:程序博客网 时间:2024/04/28 06:33
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();//connect database cls = table.getClass(); tableName = cls.getSimpleName(); fs = cls.getDeclaredFields(); this.context = context; newTable();//create a table if it does not exist } //create table 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); } //insert public void insert(T obj) { db.insert(tableName, insertColumns(), insertValues(obj)); ToastUtils.simpleToast(context, "插入成功"); } //delete by id public void delete(int id) { db.delete(tableName, "id=?", new String[]{String.valueOf(id)}); ToastUtils.simpleToast(context, "删除成功"); } //update public void update(T obj, int id) { db.update(tableName, insertValues(obj), "id=?", new String[]{String.valueOf(id)}); ToastUtils.simpleToast(context, "修改成功"); } //query by id 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; } //query all 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; } //disconnect public void close() { db.close(); } //set values for query result 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; } } } //set insert obj 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; } //use for setting insert columns private String insertColumns() { String ins = ""; //if (!contain(fs, TABLE_ID)) ins += TABLE_ID; for (int i = 0; i < fs.length; i++) { ins += "," + fs[i].getName(); } return ins.substring(1,ins.length()); } //use for judging whether tableInfo contains tableId 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) { } }}
0 0
- SQLite反射封装
- Sqlite 反射机制封装数据库
- SQLite 封装
- sqlite封装
- 【Android】SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
- SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
- SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
- Android对SQLite数据库进行封装使用反射来进行表的增删改查
- SQLite的封装类
- SQLite访问封装类
- C# 封装SQLite实现
- sqlite 操作与封装
- c++封装SQlite实例
- C++封装SQlite<二>
- C++封装SQlite<三>
- C# SQLite 简单封装
- sqlite单例封装
- SQLite的基本封装
- OS参数采集
- express 4.X cookie session
- 剑指-在字符串中找出第一个只出现一次的字符
- C语言笔试考点
- Android 设置EditText光标颜色及粗细
- SQLite反射封装
- 【规则引擎连载2】 WebSphere ILOG JRules 开发——新建一个规则项目的bom
- primary key 与 unique 约束的区别与作用
- Codeforces刷题之路——546A Soldier and Bananas
- iOS之NSURLSession的使用
- BT配对/取消配对示例
- 重新拾起转行的想法|||看到了函数部分
- Android 强大的Picasso,自定义图片效果
- python的module检索