Android – Sugar ORM拯救崩溃

我正在尝试将Sugar ORM(v 1.3)集成到我的Android应用程序中,并且在尝试保存新创建的实体时我不断遇到崩溃(NullPointerException).

这是我的崩溃……

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)

这是我的AppManifest.xml

<?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>

正如您所看到的,我肯定会根据文档将android:name设置为com.orm.SugarApp.

这是我的实体/域类……

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;
    }
}

请注意,我的实体确实扩展了SugarRecord,我确实提供了所需的空构造函数以及参数化构造函数.我没有用上下文覆盖超级init方法,因为根据Sugar ORM的v1.3中不再需要的文档.

最后,崩溃的代码……

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

保存是它崩溃的地方.现在,我已经检查过以确保通过Android设备监视器正确创建数据库,并且它确实存在于APPRAISAL表中.但是,当我查询表时它是空的,这是有道理的,因为Sugar永远不会完成save()函数.

有没有人知道我在这里做错了?为了确保我已经提供了所有相关信息,我的Gradle构建脚本如下所示.

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'
}
最佳答案
你的实体有一个默认的无参数构造函数,你不要初始化任何字段…所以你的字段的每个值都是null.

因为你有NullPointerException,如果我是你,我将尝试使用默认值初始化每个字段.例如 :

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

转载注明原文:Android – Sugar ORM拯救崩溃 - 代码日志