Java Android应用程序升级是否调用扩展应用程序的类?

Java Android应用程序升级是否调用扩展应用程序的类?,java,android,sqlite,Java,Android,Sqlite,Hi是在从Playstore执行更新时扩展调用的应用程序的类。 我的问题是,我已经在应用程序类的onCreate函数上初始化了SQLiteDatabase。当我进行升级时,我的应用程序崩溃,出现以下错误 java.lang.NullPointerException:尝试调用虚拟方法“boolean android.database.sqlite.SQLiteDatabase.isOpen() 这意味着SQLiteDatabase在更新时未初始化 有什么想法吗 下面我们是更多 java.lang.

Hi是在从Playstore执行更新时扩展调用的应用程序的类。 我的问题是,我已经在应用程序类的onCreate函数上初始化了SQLiteDatabase。当我进行升级时,我的应用程序崩溃,出现以下错误

java.lang.NullPointerException:尝试调用虚拟方法“boolean android.database.sqlite.SQLiteDatabase.isOpen()

这意味着SQLiteDatabase在更新时未初始化

有什么想法吗

下面我们是更多

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)
数据库自动更新程序

公共类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;
}
私有自定义表自定义表;
私人档案稳定;
/**
*@param context应用程序上下文
*@param dbName数据库名称
*@param dbVersion数据库版本
*/
公共DBAdapter(上下文上下文、最终字符串dbName、最终int dbVersion){
super(上下文,dbName,null,dbVersion);
customerTable=新的customerTable();
billsTable=新的billsTable();
}
/***
*创建数据库中所需的单个表
*
*@param sqlDB数据库
*/
私有void createInitialTables(SQLiteDatabase sqlDB){
试一试{
customerTable.createTable(sqlDB);
创建表(sqlDB);
}捕获(例外e){
LogUtils.showException(e);
}
}
@凌驾
public void onCreate(SQLiteDatabase sqlDB){
createInitialTables(sqlDB);
super.onCreate(sqlDB);
}
@凌驾
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
}
/**
*此方法负责关闭数据库连接。
*
*@param数据库
*/
公共void close(SQLiteDatabase db){
super.close();
//关闭前检查是否有任何打开的连接。
if(db.isOpen()){
db.close();
}
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
super.onUpgrade(数据库、旧版本、新版本);
如果(旧版本<21){
布尔表MstTemplateColumniDefault=StringUtils.checkIfColumnExists(db,SMSTemplateTable.class.getSimpleName(),SMSTemplateMap.PARSE_类型);
如果(!tableSMSTemplateColumnIsDefault){
execSQL(ALTER\u SMS\u TEMPLATES\u PARSE\u TYPE);
}
布尔表MerchantColumnisDefault=StringUtils.checkIfColumnExists(db,MerchantPayersTable.class.getSimpleName(),MerchantPayersMap.IS_默认值);
如果(!tableMerchantColumnIsDefault){
db.execSQL(默认情况下更改商户和付款人);
}
}
}
@凌驾
公共SQLiteDatabase getSqliteDatabase(){
如果(!super.getSQLiteDatabase().isOpen()){
open();
}
返回super.getSQLiteDatabase();
}
/*
*吸气剂法
*/
公共CustomerTable getCustomerTable(){
返回客户表;
}
public ProfilesTable getProfilesTable(){
回报稳定;
}
}

Android应用程序升级是否调用扩展应用程序的类

不直接。应用程序升级将终止您的进程。创建流程的新实例时,将创建
应用程序
子类的新实例。创建流程的新实例的确切时间会有所不同,具体取决于应用程序设置、用户正在做什么等

请记住,创建流程时,您的任何活动都可能是用户的起点。用户经常会在启动程序活动时启动,但情况并非总是如此

例如,假设您的启动器活动是活动A,它打开活动B,它打开活动C。此时,用户收到更新可用的通知。因此,用户点击
通知
,进入Play Store(或任何地方),并请求更新应用程序。您的过程会在过程中终止。升级完成后,用户将返回到您的应用程序(主屏幕启动器图标、概览/最近的任务列表等)。此时,您将得到一个新的流程。。。活动C将被创建并带到前台。如果您的代码假定用户将始终执行活动A,则可能会出现问题

这不是应用升级所独有的。用户可以进入A->B->C,按HOME,进入另一个应用程序10分钟,然后返回到您的应用程序。您的进程可能在UI处于后台时被终止,只是为了释放系统RAM。同样,当用户返回到您的应用程序时,您将获得一个新流程,用户将看到活动C,而不是活动a

Android应用程序升级是否调用扩展应用程序的类

不直接。应用程序升级将终止您的进程。创建流程的新实例时,将创建
应用程序
子类的新实例。创建流程的新实例的确切时间会有所不同,具体取决于应用程序设置、用户正在做什么等

请记住,创建流程时,您的任何活动都可能是用户的起点。用户经常会在启动程序活动时启动,但情况并非总是如此

例如,假设您的启动器活动是活动A,它打开活动B,它打开活动C。此时,用户收到更新可用的通知。因此,用户点击
通知
,进入Play Store(或任何地方),并请求更新应用程序。您的过程会在过程中终止。升级完成后,用户将返回到您的应用程序(主屏幕启动器图标、概览/最近的任务列表等)。此时,您将得到一个新的流程。。。活动C将被创建并带到前台。如果您的代码假定用户将始终执行活动A,则可能会出现问题

这不是应用升级所独有的。用户可能已经进入A->B->C,按HOME,进入另一个应用程序10分钟,然后返回到您的ap