使用第三方数据库很好可是升级表结构很麻烦, KJLIbary如何升级数据库
用KJDB来写数据库发现已有类添加新字段时会再调用save会报错
因为新添加字段在KJDB在已有的表中无法找到
如果需要升级数据 如给表添加字段就需要卸载重装,非常麻烦。
一种办法是。检测映射类与现有数据库表结构是否变化并修改
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); KJDB db = KJDB.create(this); /**检查表结构并升级*/ db.checkDb(); User user=new User(); user.username=""+new Random().nextInt(); user.passworld="123"; /**追加的新字段*/ user.newfield="a"; db.save(user); } }
org.kymjs.aframe.database.KJDB中插入一个新方法
/**检查类变化时数据库表结构是否变化并修改*/ public void checkDb() { /***/ Cursor cursor = db.rawQuery( "SELECT name FROM sqlite_master WHERE type ='table'", null); if (cursor != null) { while (cursor.moveToNext()) { try { String tablename = cursor.getString(0); String classname = tablename.replaceAll("_", "."); /**查询表所映射类的信息*/ TableInfo info = TableInfo.get(classname); if (info != null) { // cudb.rawQuery("PRAGMA table_info(tbl_sfg_device)", null); // Cursor c=db.rawQuery("PRAGMA table_info("+tablename+")", null); Iterator<Map.Entry<String, Property>> it = info.propertyMap .entrySet().iterator(); // 检查该表是否有这个字段 HashMap<String, Boolean> map = new HashMap<String, Boolean>(); try { Cursor columns = db.rawQuery("PRAGMA table_info("+tablename+")", null); while(columns.moveToNext()) { map.put(columns.getString(1), false); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(e); } /** 遍历类所有字段 */ while (it.hasNext()) { Map.Entry<String, Property> item = it.next(); String key = item.getKey(); /**该字段不存在新建*/ if (map.get(key) == null) { db.execSQL("ALTER TABLE " + tablename + " ADD COLUMN " + key + " " + "CHAR"); map.put(key, true); } } it = info.propertyMap .entrySet().iterator(); /**删除未映射字段*/ while(it.hasNext()){ Map.Entry<String, Property> item = it.next(); String key = item.getKey(); /**该字段未被遍历删除*/ if (map.get(key)==true) { db.execSQL("ALTER TABLE "+tablename+" DROP COLUMN "+key); } } } } catch (SQLException e) { KJLoger.debug(getClass().getName() + e.getMessage()); } } } if (cursor != null) { cursor.close(); cursor = null; } }