查看該表啤咽,發(fā)現(xiàn)并沒有實(shí)現(xiàn)實(shí)例化接口晋辆。
通過下面方法反射出所有的屬性,發(fā)現(xiàn)確實(shí)多了一個(gè)$change 和一個(gè)serialVersionUID宇整。
public static void showAnnotationWrodOther(){
Field[] fields = DbApp.class.getFields();
for (Field field : fields) {
field.setAccessible(true);
LogUtil.d("DbAppfield getFields name = " + field.getName());
}
fields = DbApp.class.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
LogUtil.d("DbAppfield getDeclaredFields name = " + field.getName());
}
}
change.png
通過查閱資料瓶佳,AndroidStudio開啟InstantRun時(shí)會(huì)出現(xiàn)這種情況。過程存在序列化操作鳞青。所以關(guān)閉InstantRun霸饲。File>Settings>Instant Run 選項(xiàng)全部關(guān)閉。
猜測(cè)熱修復(fù)也可能會(huì)有這種情況臂拓?(不確定)
但是一般情況下厚脉,多出的這兩個(gè)屬性不應(yīng)該會(huì)影響插入數(shù)據(jù)庫(kù)。但是我們底層封裝數(shù)據(jù)庫(kù)的時(shí)候并不嚴(yán)謹(jǐn)埃儿。
是通過反射獲取的所有不為空的屬性作為表列器仗。所以也會(huì)把這個(gè)屬性認(rèn)為是存在的列。
解決辦法:
1.關(guān)閉Instant Run
2.修改框架,根據(jù)是否有DatabaseField注解來(lái)獲取對(duì)應(yīng)的列精钮。field.isAnnotationPresent(DatabaseField.class);