2015-01-21 17 views
5

Tôi đang cố gắng tích hợp Sugar ORM (v 1.3) vào ứng dụng Android của mình và tôi tiếp tục gặp sự cố (NullPointerException) khi cố lưu một thực thể mới được tạo.Android - Sugar ORM Lưu Crash

Đây là vụ tai nạn của tôi ...

01-21 06:02:36.012 2856-2856/com.spuddmobile.kel E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.spuddmobile.kel, PID: 2856 
    java.lang.NullPointerException 
      at com.orm.SugarRecord.save(SugarRecord.java:109) 
      at com.orm.SugarRecord.save(SugarRecord.java:45) 
      at com.spuddmobile.kel.Fragments.NewAppFragment._SaveForm(NewAppFragment.java:231) 
      at com.spuddmobile.kel.Fragments.NewAppFragment.onMenuItemSelection(NewAppFragment.java:175) 
      at com.spuddmobile.kel.Activities.MainActivity.onOptionsItemSelected(MainActivity.java:89) 
      at android.app.Activity.onMenuItemSelected(Activity.java:2600) 
      at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1012) 
      at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
      at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
      at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
      at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546) 
      at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115) 
      at android.view.View.performClick(View.java:4438) 
      at android.view.View$PerformClick.run(View.java:18422) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      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:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 

Đây là AppManifest.xml tôi

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.spuddmobile.kel" > 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:name="com.orm.SugarApp" 
     android:theme="@style/AppTheme" > 

     <meta-data android:name="DATABASE" android:value="kel.db" /> 
     <meta-data android:name="VERSION" android:value="1" /> 
     <meta-data android:name="QUERY_LOG" android:value="true" /> 
     <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.spuddmobile.kel.Model" /> 

     <activity 
      android:name=".Activities.MainActivity" 
      android:label="@string/app_name" 
      android:windowSoftInputMode="stateHidden|adjustResize"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <meta-data android:name="android.support.UI_OPTIONS" android:value="splitActionBarWhenNarrow" /> 
     </activity> 
    </application> 

</manifest> 

Như bạn có thể thấy tôi chắc chắn đang thiết lập các android:name để com.orm.SugarApp mỗi tài liệu.

Đây là lớp thực thể/tên miền của tôi ...

public class Appraisal extends SugarRecord<Appraisal> 
{ 
    Double rent; 
    Integer area; 
    Integer currentPeriod; 
    Integer reviewFrequency; 
    Integer rentFreePeriod; 
    Integer interimRentPeriod; 
    Double interimRentPrice; 
    Integer secondInterimRentPeriod; 
    Double secondInterimRentPrice; 
    Double incentives; 
    Integer breakPeriod; 
    Double breakPenalty; 
    Double breakIncentiveRent; 
    Integer breakIncentiveRentPeriod; 
    Double breakRisk; 
    String name; 
    Date createdDate; 
    Date updatedDate; 

    public Appraisal() 
    { 

    } 

    public Appraisal (Double rent, 
         Integer area, 
         Integer currentPeriod, 
         Integer reviewFrequency, 
         Integer rentFreePeriod, 
         Integer interimRentPeriod, 
         Double interimRentPrice, 
         Integer secondInterimRentPeriod, 
         Double secondInterimRentPrice, 
         Double incentives, 
         Integer breakPeriod, 
         Double breakPenalty, 
         Double breakIncentiveRent, 
         Integer breakIncentiveRentPeriod, 
         Double breakRisk, 
         String name, 
         Date createdDate, 
         Date updatedDate) 
    { 
     this.rent = rent; 
     this.area = area; 
     this.currentPeriod = currentPeriod; 
     this.reviewFrequency = reviewFrequency; 
     this.rentFreePeriod = rentFreePeriod; 
     this.interimRentPeriod = interimRentPeriod; 
     this.interimRentPrice = interimRentPrice; 
     this.secondInterimRentPeriod = secondInterimRentPeriod; 
     this.secondInterimRentPrice = secondInterimRentPrice; 
     this.incentives = incentives; 
     this.breakPeriod = breakPeriod; 
     this.breakPenalty = breakPenalty; 
     this.breakIncentiveRent = breakIncentiveRent; 
     this.breakIncentiveRentPeriod = breakIncentiveRentPeriod; 
     this.breakRisk = breakRisk; 
     this.name = name; 
     this.createdDate = createdDate; 
     this.updatedDate = updatedDate; 
    } 
} 

ý rằng thực thể của tôi không thực sự mở rộng SugarRecord và tôi cung cấp các constructor rỗng cần cũng như một constructor tham số. Tôi KHÔNG ghi đè phương thức siêu init với một ngữ cảnh vì theo tài liệu không còn cần thiết trong v1.3 của Sugar ORM.

Cuối cùng, mã mà treo ...

// create new app 
Appraisal nApp = new Appraisal(); 
nApp.save(); 

Pha cản phá xuất là nơi nó bị treo. Bây giờ, tôi đã kiểm tra để đảm bảo cơ sở dữ liệu đang được tạo chính xác, thông qua Trình theo dõi thiết bị Android và trên thực tế nó tồn tại với một bảng APPRAISAL. Tuy nhiên, khi tôi truy vấn bảng nó trống rỗng, điều này có nghĩa là Sugar không bao giờ hoàn thành hàm save().

Có ai có ý tưởng nào với tôi đang làm sai ở đây không? Chỉ để đảm bảo tôi đã đưa ra tất cả các thông tin cần thiết, kịch bản Gradle build của tôi ở dưới đây.

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
    } 
} 

apply plugin: 'android' 

android { 
    compileSdkVersion 13 
    buildToolsVersion '19.1.0' 
    defaultConfig { 
     applicationId 'com.spuddmobile.kel' 
     minSdkVersion 13 
     targetSdkVersion 17 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
    productFlavors {} 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.noveogroup.android:android-logger:1.3.4' 
    compile 'com.github.satyan:sugar:1.3' 
} 

Trả lời

4

thực thể của bạn có một mặc định constructor không có tham số nơi bạn KHÔNG intialize bất kỳ lĩnh vực ... Vì vậy, mỗi giá trị của lĩnh vực của bạn là null.

Khi bạn có NullPointerException, nếu tôi là bạn, tôi sẽ cố gắng bắt đầu mọi trường bằng giá trị mặc định. Ví dụ:

public Appraisal() 
{ 
    this.rent = 0.0; 
    this.area = 0; 
    ... 
} 
+0

Tôi sẽ thử, nhưng trên tài liệu của riêng Sugar không cần thiết. http://satyan.github.io/sugar/getting-started.html. Sẽ đăng lại nếu điều này giải quyết được vấn đề của tôi. –

+2

Ok, vì vậy đầu tiên off bravo !! Hóa ra là Sugar không thích các đối tượng NULL Date. Sau khi tôi đã cung cấp cả hai giá trị mặc định của thuộc tính Date thì nó bắt đầu hoạt động. –

+0

Ngoài ra, tôi không biết tại sao một người nào đó cho bạn phiếu bầu xuống. Câu trả lời của bạn đưa tôi đến các giải pháp chính xác, vì vậy tôi sẽ bỏ phiếu cho bạn và chấp nhận câu trả lời. –

2

Đường ORM sẽ thừa nhận các đối tượng rỗng của loại java.sql.Timestamp.

Điều này có thể phá vỡ các phần khác của mã của bạn (ví dụ: equals không hoạt động để so sánh java.sql.Timestamp và java.util.Date).

Các vấn đề liên quan