0

私のアクティビティの onCreate に次のコードがあるとします。

        super.onCreate(savedInstanceState);

        setContentView(R.layout.logmenu);

        //DEBUG CODE
        new DBAdaptor(this).dropDatabase();

        if (!DBAdaptor.checkDataBase() ) {
            showDialog(DIALOG_NO_DB);
        }


        seasonSpinner = (Spinner) findViewById(R.id.seasonspinner);

        List<String> seasons = new ArrayList<String>(); 
        SQLiteDatabase db = new DBAdaptor(this).getReadableDatabase();


       /* //Select _key FROM seasons;
        Cursor results = db.query("seasons", new String[] {"_key"}, null, null, null, null, null);
        results.moveToFirst();
        do {
            String season = results.getString(results.getColumnIndex("_key"));
            seasons.add(season);
        } while (results.moveToNext());*/

示されているように、スピナーを設定するセクションをコメントアウトして実行すると、次のことが起こります。

  1. ビューがレンダリングされます。次のチェックが失敗するように、最後の実行からのデータベースが目に見えないように削除されます
  2. データベースを初期化するかどうかを尋ねるダイアログが表示されます。はいをクリックします。
  3. データベースの初期化が実行されます (リモート サーバーとの通信を含む)
  4. データベースにデータが入力され、使用できるようになりました
  5. コントロールはこのビューに戻り、空のスピナーはすべて孤独になります。

ただし、ブロックのコメントを外すと、これらのステップは実行されません。代わりに、SQLiteException を取得します:「そのようなテーブルはありません: 季節: 、コンパイル中: SELECT _key FROM 季節」

ステップ 1 ~ 5 が発生しないのはなぜですか? 準備が整う前に、先にジャンプしてそのクエリをコンパイルしようとするのはなぜですか? そして、これを防ぎ、順番に実行するにはどうすればよいですか?

4

1 に答える 1

1

あなたの問題は、作成したダイアログ ボックスがメソッドの残りの部分をブロックしないことだと思います。そのため、ユーザーが (ダイアログ ボックスを介して) アプリケーションにデータベースを作成するように指示する前に、まだスピナーにデータを入力しようとしています。

于 2012-05-25T13:13:56.950 に答える