-1

他のすべての「SQLiteExceptionnosuchtable」メッセージを読みましたが、私の主張に対する答えが見つかりませんでした。

データベースに複数のテーブルがあるAndroidアプリケーションを作成しています。私はそれを段階的に構築します。最初のテーブルAと、データを追加/編集するためのフォームを作成しました。私はLoaderThrottleandroidサンプルで自分自身にインスピレーションを与えました。それは完璧に機能していました。この後、テーブルAとまったく同じようにテーブルBと、データを追加するためのフォームを作成しました。

次に、テーブルBのフィールドを忘れたのを確認しました。このフィールドを追加して、テーブルBをバージョン2に切り替えようとしました。しかし、多くの問題が発生しました。「ダウングレード」および「アップグレード」エラー...アプリケーションデータを消去し、デバイスからアプリケーションをアンインストールしたため、データベースが削除され、最初の起動時に再作成されました。

しかし今、アプリケーションを起動すると、例外が発生します<< android.database.sqlite.SQLiteException:no such table:A:、whileコンパイル中:SELECT name、_id FROM A WHERE((active = 1))>>? !?

dbHelperがデータベースを作成しないのはなぜですか?そのonCreateメソッドを明示的に呼び出す必要がありますか?データベースのすべてのテーブルに一意のdbHelperが必要ですか、それともテーブルごとに1つのdbHelperが必要ですか(現在持っているもの)?

詳細情報:-マニフェストでは、各テーブルのコンテンツプロバイダーにリンクされた2つのプロバイダーがあります。

編集:これが各テーブルの作成コードです。

表A(例外があります):

       public void onCreate(SQLiteDatabase db) {
       db.execSQL("CREATE TABLE " + ActivityTable.TABLE_NAME + " ("
               + ActivityTable._ID                + " INTEGER PRIMARY KEY, "
               + ActivityTable.COLUMN_NAME_TITLE  + " TEXT NOT NULL, "
               + ActivityTable.COLUMN_NAME_CODE   + " TEXT, "
               + ActivityTable.COLUMN_NAME_ACTIVE + " smallint NOT NULL  DEFAULT 1, "
               + ActivityTable.COLUMN_NAME_CPTI   + " smallint NOT NULL  DEFAULT 1 "
               + ");");
   }

表B:

       public void onCreate(SQLiteDatabase db) {
       db.execSQL("CREATE TABLE " + TrackTable.TABLE_NAME + " ("
               + TrackTable._ID                     + " INTEGER PRIMARY KEY, "
               + TrackTable.COLUMN_NAME_DATE        + " long NOT NULL, "
               + TrackTable.COLUMN_NAME_ACTIVITY_ID + " int NOT NULL DEFAULT 0, " 
               + TrackTable.COLUMN_NAME_DAYPART     + " smallint NOT NULL  DEFAULT 0, "
               + TrackTable.COLUMN_NAME_NPQ         + " smallint NOT NULL  DEFAULT 0, " 
               + TrackTable.COLUMN_NAME_NBPID       + " long NOT NULL  DEFAULT 0 " 
               + ");");
   }

手がかりを事前に感謝します。フローレント

4

1 に答える 1

1

何度か試した後、私はついに自分自身を解き放ちました。

なぜそうしなければならないのか本当に理解していなくても、私はあなたに私の解決策を与えます。私の質問には答えがなかったので、いつか誰かを助けることができました。

念のため、LoaderThrottleandroidサンプルから始めました。このファイルを参照してください。

SQLiteOpenHelperから派生した子クラスのonCreateメソッドで、次のように変更します。

db.execSQL("CREATE TABLE " + ...

に :

db.execSQL("CREATE TABLE IF NOT EXISTS " + ...

次に、ContentProviderから派生した子クラスのonCreateメソッドで、DbHelperonCreateメソッドを直接呼び出します。

     /**
     * Perform provider creation.
     */
    @Override
    public boolean onCreate() {
        mOpenHelper = new ActivityDbHelper(getContext());
        // Assumes that any failures will be reported by a thrown exception.

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        mOpenHelper.onCreate(db);

        return true;
    }

楽しんで、フローレント

于 2012-09-24T20:43:55.470 に答える