litesuits / android-lite-orm

LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.
http://litesuits.com?form=gorm
Apache License 2.0
1.49k stars 362 forks source link

是否支持成员变量为其他对象 #16

Closed msdx closed 8 years ago

msdx commented 8 years ago

插入如下对象时报空指针异常:

public class Province extends Area implements Parcelable {

    @JSONField(name = "cities")
    public ArrayList<City> cities;
    //...
}

其中City也继承自Area:

public class City extends Area implements Parcelable {

    @JSONField(name = "areas")
    public ArrayList<Area> areas;
    //...
}

Area的结构如下:

public class Area implements Parcelable {
    @JSONField(name = "name")
    public String name;
    @JSONField(name = "code")
    public int code;
    @JSONField(name = "level")
    public final int level;
    //...
}

异常信息如下:

 java.lang.NullPointerException
     at com.litesuits.orm.db.assit.SQLBuilder.buildInsertSql(SQLBuilder.java:270)
     at com.litesuits.orm.db.assit.SQLBuilder.buildReplaceAllSql(SQLBuilder.java:236)
     at com.litesuits.orm.db.impl.SingleSQLiteImpl.save(SingleSQLiteImpl.java:74)
     at com.parkingwang.app.support.CacheHelper.saveToDbCache_aroundBody6(CacheHelper.java:97)
     at com.parkingwang.app.support.CacheHelper$AjcClosure7.run(CacheHelper.java:1)
     at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
     at hugo.weaving.internal.Hugo.logAndExecute(Hugo.java:30)
     at com.parkingwang.app.support.CacheHelper.saveToDbCache(CacheHelper.java:97)
     at com.parkingwang.app.account.vehicle.VehicleCallback.onUISuccess(VehicleCallback.java:37)
     at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:79)
     at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:35)
     at com.github.yoojia.fast.http.ParsableHttpCallback$1.handleMessage(ParsableHttpCallback.java:29)
     at android.os.Handler.dispatchMessage(Handler.java:106)
     at android.os.Looper.loop(Looper.java:193)
     at android.app.ActivityThread.main(ActivityThread.java:5551)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730)
     at dalvik.system.NativeStart.main(Native Method)
litesuits commented 8 years ago

你的entity对象,没有注解标注主键,也没有命名为_id或者id的字段。所以无法找到主键。添加一个自增的主键就好了,见sample案例

msdx commented 8 years ago

@litesuits 其他对象也是没有加id但是没有报这个错。 我刚才加了id:

public long id;

报错如下:

 java.lang.NullPointerException
     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:43)
     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
     at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1032)
     at com.litesuits.orm.db.assit.SQLStatement.execInsertCollectionWithMapping(SQLStatement.java:143)
     at com.litesuits.orm.db.assit.SQLStatement.execInsertCollection(SQLStatement.java:132)
     at com.litesuits.orm.db.impl.SingleSQLiteImpl.save(SingleSQLiteImpl.java:76)
     at com.parkingwang.app.support.CacheHelper.saveToDbCache_aroundBody6(CacheHelper.java:97)
     at com.parkingwang.app.support.CacheHelper$AjcClosure7.run(CacheHelper.java:1)
     at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
     at hugo.weaving.internal.Hugo.logAndExecute(Hugo.java:30)
     at com.parkingwang.app.support.CacheHelper.saveToDbCache(CacheHelper.java:97)
     at com.parkingwang.app.account.vehicle.VehicleCallback.onUISuccess(VehicleCallback.java:37)
     at com.parkingwang.app.account.vehicle.VehicleListActivity$VehicleNumberListFragment$3.onUISuccess(VehicleListActivity.java:89)
     at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:79)
     at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:35)
     at com.github.yoojia.fast.http.ParsableHttpCallback$1.handleMessage(ParsableHttpCallback.java:29)
     at android.os.Handler.dispatchMessage(Handler.java:106)
     at android.os.Looper.loop(Looper.java:193)
     at android.app.ActivityThread.main(ActivityThread.java:5551)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730)
     at dalvik.system.NativeStart.main(Native Method)
litesuits commented 8 years ago

手机上删掉App,重新run

msdx commented 8 years ago

试过了,一样的。

litesuits commented 8 years ago

竟有这样的事情。

  1. 确认是最新的jar包,应该是1.7.x版。
  2. 给id加主键注解 @PrimaryKey(AssignType.AUTO_INCREMENT) public long id;
  3. 再贴一下你的实体类看一下
msdx commented 8 years ago

用的是1.7.0。 实体类的所有成员变量 就是上面的了,其他的是实现Parcelable的内容加上带参及不带参的构造方法。 按照你的第2个提供,我在父类Area中加上id,还是一样的异常。 此问题我还没解决,是否应该重新打开issue?