先說結論
GreenDao的主鍵,如果要是用自增的話,必須將主鍵字段定義成簡單類型的包裝類型,即Integer、Long。
再探原因
GreenDao對數據表實體(這里假設為Student)生成StudentDao類時,該類會繼承自AbstractDao並實現幾個重要的虛方法,主要的CRUD操作都在AbstractDao已實現,而生成的StudentDao中所實現的方法起到定制化的控制作用。
這里着重說踩到的坑。如果主鍵定義成簡單類型,生成的***Dao類中,建表語句會將主鍵限定成NOT NULL
,hasKey方法會拋一個異常,如下所示
@Override
public boolean hasKey(JKIMUser entity) {
throw new UnsupportedOperationException("Unsupported for entities with a non-null key");
}
而不巧的是,hasKey方法只有使用save
類方法保存插入、更新數據時才會調用,如果你使用insertOrReplace
插入數據,不好意思,直接插入了!簡單類型的默認值0被當做了你指定的主鍵值(你說手動設成-1?那不就更是你指定的主鍵值了么!),
所以不管你怎么插入,數據表都會只有一條數據,因為第一次之后的調用都會被認為是在更新這個Key為0的記錄!!!
從上面hasKey方法拋出的異常也可以看出,GreenDao的設計就是需要使用者提供可空類型的主鍵,當插入、更新數據時,GreenDao實現會以主鍵字段是否為空來作為調用者是否指定了主鍵值的依據。