2016-11-30 4 views
0

こんにちは、Playstoreからの更新を行うときに呼び出されるアプリケーションを拡張するクラスです。 私の問題は、私のアプリケーションクラスのonCreate関数でSQLiteDatabaseを初期化したことです。私は以下のエラーでやると私のアプリのクラッシュをアップグレードする場合Android Application UpgradeはApplicationを拡張するClassを呼び出しますか?

のjava.lang.NullPointerException:仮想メソッド「ブールandroid.database.sqlite.SQLiteDatabase.isOpenを(呼び出そうと)

SQLiteDatabaseを意味していますUPDATEで初期化されません。

いずれかのアイデア???我々はより多くのです

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.database.sqlite.SQLiteDatabase.isOpen()' on a null object reference 
at com.cellulant.consumerapp.db.DBAdapter.getSqliteDatabase(DBAdapter.java:518) 
at com.cellulant.consumerapp.fragments.PaymentsFragment.onCreateView(PaymentsFragment.java:113) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2074) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) 
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1632) 
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637) 
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1235) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1083) 
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1609) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668) 
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:465) 
at android.view.View.measure(View.java:17923) 
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1079) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:465) 
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1692) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:760) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:465) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1692) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:760) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5698) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:465) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2733) 
at android.view.View.measure(View.java:17923) 
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2461) 
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1463) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1341) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6700) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800) 
at android.view.Choreographer.doCallbacks(Choreographer.java:603) 
at android.view.Choreographer.doFrame(Choreographer.java:572) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:786) 
at android.os.Handler.handleCallback(Handler.java:815) 
at android.os.Handler.dispatchMessage(Handler.java:104) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5637) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

DB Apdater

パブリッククラスDBAdapterがSQLHelper {

private CustomerTable customerTable; 
private ProfilesTable profilesTable; 


/** 
* @param context Application Context 
* @param dbName Database name 
* @param dbVersion database version 
*/ 
public DBAdapter(Context context, final String dbName, final int dbVersion) { 

    super(context, dbName, null, dbVersion); 
    customerTable = new CustomerTable(); 
    billsTable = new BillsTable(); 

} 

/*** 
* Create individual table needed in database 
* 
* @param sqlDB Database 
*/ 
private void createInitialTables(SQLiteDatabase sqlDB) { 

    try { 
     customerTable.createTable(sqlDB); 
     billsTable.createTable(sqlDB); 


    } catch (Exception e) { 
     LogUtils.showException(e); 
    } 


} 
@Override 
public void onCreate(SQLiteDatabase sqlDB) { 
    createInitialTables(sqlDB); 
    super.onCreate(sqlDB); 
} 

@Override 
public void onOpen(SQLiteDatabase db) { 
    super.onOpen(db); 
} 

/** 
* This method is responsible for closing the database connection. 
* 
* @param db Database 
*/ 
public void close(SQLiteDatabase db) { 
    super.close(); 
    //Check if there is any open connection before closing. 
    if (db.isOpen()) { 
     db.close(); 
    } 
} 


@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    super.onUpgrade(db, oldVersion, newVersion); 


    if (oldVersion < 21) { 


     boolean tableSMSTemplateColumnIsDefault = StringUtils.checkIfColumnExists(db, SMSTemplateTable.class.getSimpleName(), SMSTemplateMap.PARSE_TYPE); 
     if (!tableSMSTemplateColumnIsDefault) { 
      db.execSQL(ALTER_SMS_TEMPLATES_PARSE_TYPE); 
     } 
     boolean tableMerchantColumnIsDefault = StringUtils.checkIfColumnExists(db, MerchantPayersTable.class.getSimpleName(), MerchantPayersMap.IS_DEFAULT); 
     if (!tableMerchantColumnIsDefault) { 
      db.execSQL(ALTER_MERCHANT_PAYER_IS_DEFAULT); 
     } 



    } 

} 

@Override 
public SQLiteDatabase getSqliteDatabase() { 
    if (!super.getSQLiteDatabase().isOpen()) { 
     open(); 
    } 
    return super.getSQLiteDatabase(); 
} 

/* 
* Getter Methods 
*/ 

public CustomerTable getCustomerTable() { 
    return customerTable; 
} 

public ProfilesTable getProfilesTable() { 
    return profilesTable; 
} 

}

+0

コードなしでは答えにくいです。より詳細なstacktraceとアプリケーションクラスを投稿してください –

+0

上記のYves DelermはStacktraceです – kubs

+0

ありがとうございました。私はあなたのデータベースがアプリケーションクラスでどのように初期化されてDBAdapterで取得されたかを確認するのに役立つかもしれないと思います –

答えて

2

Androidのアプリケーションは、拡張するクラスを呼び出すアップグレードんを拡張以下

応用?

直接ではありません。アプリケーションのアップグレードにより、プロセスが終了します。プロセスの新しいインスタンスが作成されると、サブクラスApplicationの新しいインスタンスが作成されます。正確にはの場合あなたのプロセスの新しいインスタンスが作成されるのは、アプリケーションの設定、ユーザーの行い方などによって異なります。

あなたのアクティビティは、プロセスが作成されます。ユーザーは頻繁にになりますが、必ずしもそうではありません。

たとえば、ランチャーアクティビティがアクティビティAでアクティビティBが開き、アクティビティCが開いているとします。この時点で、ユーザーはNotificationのアップデートが利用可能になります。そのため、ユーザはNotificationをタップしてPlayストア(またはどこにでも)に行き、アプリの更新をリクエストします。プロセスは途中で終了します。アップグレードが完了すると、ユーザーはアプリ(ホームスクリーンランチャーアイコン、概要/最近のタスクリストなど)に戻ります。この時点で、新しいプロセスが作成され、アクティビティCが作成され、フォアグラウンドに持ち込まれます。あなたのコードで、ユーザが常にアクティビティAを通過すると想定されている場合は、問題が発生する可能性があります。

これはアプリのアップグレードでは一意ではありません。ユーザーはA-> B-> C、HOMEを押して別のアプリに10分間移動してからアプリに戻ってきた可能性があります。 UIがバックグラウンドになっている間に、システムRAMを解放するだけで、プロセスが正常に終了している可能性があります。もう一度、ユーザーがあなたのアプリに戻ると、新しいプロセスが作成され、アクティビティAではなくアクティビティCが表示されます。

関連する問題