Android开发——数据库框架Suger遇到的大坑(Gson和Suger的复用Bean请见“大坑三”)

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和Suger绑定,解决方法如下:

步骤一:

写一个类继承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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值