Android - Sugar ORM拯救崩溃

时间:2015-01-21 11:17:10

标签: android orm sugarorm

我正在尝试将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'
}

2 个答案:

答案 0 :(得分:4)

您的实体有一个默认的无参数构造函数,您不要初始化任何字段...因此,您的字段的每个值都是null

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

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

答案 1 :(得分:2)

Sugar ORM将确认类型为java.sql.Timestamp。

的null对象

这可能会破坏代码的其他部分(例如,equals不能比较java.sql.Timestamp和java.util.Date)。