7

私の Android アプリでは、ユーザーがアプリを使用できるようにアカウントを作成する必要があります。アカウント情報は SQLite データベースに保存されます。アプリケーションの起動時に、ユーザーがアカウントを持っているかどうかを確認し、持っていない場合はユーザーのサインアップ アクティビティを表示します。

今では、ユーザーから、既にアカウントを作成しているにもかかわらず、サインアップ アクティビティに来ることがあるという報告を受けています。これは、アプリケーションを閉じて再度開いたときに発生します。

これは私が使用しているコードであり、問​​題が何であるかを把握する必要があります:

//MyApplication.java
public class MyApplication extends Application {
    private DataBaseUtility dbu;
    public boolean hasAccount;  

    @Override
    public void onCreate() {
        super.onCreate();

        //Init sqlite database
        this.dbu = new DataBaseUtility(this);

        //This loads the account data from the database and returns true if the user has already created an account
        this.hasAccount = loadAccount();
    }

    public boolean loadAccount() {
        boolean loadedData = false;

        String query = "SELECT data FROM tblaccount WHERE tblaccount.deleted=0";
        Cursor cursor = this.dbu.getCursor(query);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                loadedData = true;
            }
            cursor.close();
        }

        return loadedData;
    }
}

//MainActivity.java
public class MainActivity extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MyApplication application = (MyApplication)getApplication();
        if (!application.hasAccount) {
            //Take the user to the sign up activity
        }
}

私の考えでは、 のMainActivity.onCreate()前に実行されることがありますMyApplication.onCreate()。そんなことありえますか?

4

1 に答える 1

3

では、ユーザーapplicationonCreateアカウントを持っているかどうかを確認し、ブール値を設定しています。

ユーザーがブール値を介してアカウントを持っているかどうかをチェックインしてMainActivityいます。onCreateapplication

applicationonCreate()前に実行するMainActivityonCreate()常に当てはまります!別の実行パスが発生することは不可能であり、application'sにはそれonCreate()がないためRunnable、100%保証されます。

DataBaseUtilityRunnablesがないことを確認してください。

とにかく、それでもエラーを再現する方法はいくつかあります!私は今これらを述べませんが、あなたが見るときあなたはそれらを知ることができます:

解決

MainActivityapplication.hasAccountサインアップに成功したときに更新するのを忘れました〜

public class MainActivity extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MyApplication application = (MyApplication)getApplication();
        if (!application.hasAccount) {
            //Take the user to the sign up activity
            //if(successful) application.hasAccount = true
        }
}

データベースの例外を回避するには

私はこれを使用します:

備考データベースには、より強力な永続的なステータス保存を使用する方がはるかに優れています。SharedPreferences

boolean isOpened = false;
//When I need to open
if(!isOpened){
    //open
    isOpened = true;
}
//When I need to close
if(isOpened){
    //close
    isOpened = false;
}

onDestroy() {  //every onDestroy
    if(isOpened){
        //close
    }
}
于 2011-08-03T08:57:42.617 に答える