Android開發——資料庫框架Suger遇到的大坑(Gson和Suger的複用Bean請見“大坑三”)
阿新 • • 發佈:2018-11-05
Android開發——資料庫框架Suger遇到的大坑(Gson和Suger的複用Bean請見“大坑三”)
大坑一
自己寫了一個Demo按照官網以及GitHub上Suger的使用步驟完整走下來,Demo閃退,以插入資料為例
User user = new User("liao","123");
user.setUserName("liao");
user.setPassWord("789");
user.save();
Log.i("test",String.valueOf(user.save()));
User是一個bean,除錯時一到user.save();
步驟一:
寫一個類繼承Application
第一種寫法:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SugarContext.init(this);
}
@Override
public void onTerminate() {
super .onTerminate();
SugarContext.terminate();
}
}
第二種寫法:
public class MyApplication extends SugarApp {
@Override
public void onCreate() {
super.onCreate();
SugarContext.init(this);
}
@Override
public void onTerminate() {
super.onTerminate();
}
}
步驟二:
在AndroidManifast.xml檔案中進行繫結
<application
...
android:name="com.example.lj_xwl.sugerdb.MyApplication">
</application>
大坑二
Demo執行仍然掛掉,但是有報錯資訊了
<!--建立資料庫-->
<meta-data android:name="DATABASE" android:value="test.db"/>
<meta-data android:name="VERSION" android:value="2"/>
<meta-data android:name="QUERY_LOG" android:value="true"/>
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.example.lj_xwl.sugerdb.bean"/>
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sugerdemo/com.sugerdemo.MainActivity}: android.database.sqlite.SQLiteException: Can't downgrade database from version 3 to 2
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
原來是版本問題 將版本改為3就可以 只能從低往高改 不能從高往低,若要改為低版本,解決辦法是解除安裝工程、clean重新編譯。
大坑三
伺服器要傳id,客戶端存這個欄位時,id值與Suger裡存的id值有衝突。其實就是Gson和Suger複用Bean問題。
Suger的id為int和long型別,在自己的bean中設定的getId0會有衝突:
long id;
public long getId() {
return id;
}
Error:(14, 17) 錯誤: User中的getId()無法覆蓋SugarRecord中的getId()
返回型別long與Long不相容
若要存這個id且不和Suger的id衝突,網上的方法是用Gson中的@SerializedName註解,分別用Suger官網的兩種用法如下:
方法一:
public class UserBackInfo extends SugarRecord{
// @Unique
@Expose
@SerializedName("id")
Long id; //使用者id
@Expose
String uname;//使用者姓名
@Expose
String upwd;//密碼
@Expose
String uphone;//手機(使用者名稱)
public UserBackInfo(){
}
public UserBackInfo(Long id, String uname, String upwd, String uphone) {
this.id = id;
this.uname = uname;
this.upwd = upwd;
this.uphone = uphone;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
方法二:
@Table
public class UserBackInfo{
// @Unique
@Expose
@SerializedName("id")
Long id; //使用者id
@Expose
String uname;//使用者姓名
@Expose
String upwd;//密碼
@Expose
String uphone;//手機(使用者名稱)
public UserBackInfo(){
}
public UserBackInfo(Long id, String uname, String upwd, String uphone) {
this.id = id;
this.uname = uname;
this.upwd = upwd;
this.uphone = uphone;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
除錯後發現,方法一程式掛掉,方法二完美完成資料庫操作,實現了Gson和Suger的複用Bean問題。
注意:
1、 Gson的@Expose要註解在每一個變數中
2、@SerializedName(“id”)是解決複用問題的關鍵
3、複用Bean後查詢從伺服器拿來的Gson資料的Id是多少Suger裡存的就是多少,比如我接到的id是25且只插入了這一條,那麼如下可以查到資料
UserBackInfo quary = SugarRecord.findById(UserBackInfo.class,25);
如下不能查到:
UserBackInfo quary = SugarRecord.findById(UserBackInfo.class,1);
因為資料庫中第一條資料就是id為25的,沒有id為1的。從而驗證了Gson和Suger確實複用了Bean。