11

私はデータベース アプリケーションを作成しています。私のプログラムは動作し、私が従ってきたチュートリアルのほとんどを理解しました。しかし、私には不明な点が 1 つあります。

SQLiteOpenHelper を拡張する MyDBHelper の内部クラスがあります。外部変数には、d と呼ばれる SQLiteDatabase が含まれます。MyDBHelper のコードは次のとおりです。

private static class MyDBHelper extends SQLiteOpenHelper {
        MyDBHelper(Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) {
            Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data.");
            db.execSQL("DROP TABLE IF EXISTS GM");
            onCreate(db);
        }
    }

私の質問は、これが実際に初期データベースをどのように作成するかです。onCreate() メソッドで発生しますが、私が見る限り、これは呼び出されません。データベースを初めて作成するときに呼び出されることは理解していますが、どこで? さらに、SQLiteDatabase db はどのように渡されますか? メソッドにデータベースを渡していません。外部クラスの SQLiteDatabase db 変数は、作成されたデータベースにどのように設定されますか? 誰かがバカみたいに話してくれませんか?

4

7 に答える 7

8

onCreate()onUpgrade()Dbが最初に作成されるときに、メソッドが実際に呼び出されます。getReadableDatabase() or getWritebleDatabase()実際には、のメソッドでチェックインされていますSQLiteOpenHelper。DBがデータディレクトリにすでに存在するかどうか、およびそのバージョンは何かをチェックします。これによると、どちらかを呼び出しますonCreate(), or onUpgrade()。または、dbファイルが存在し、バージョンが正しい場合は何もありません。

を実行するためにコードを検索できますmyDBHelper.getReadable(Writable)Database()。これが、このチェックが実行される時間です。

詳細が必要な場合はお知らせください。幸運を

于 2012-09-03T20:33:16.050 に答える
4

getReadableDatabase()SQLiteOpenHelper を拡張していることに注意してください。すべての魔法はこのスーパー クラスで発生します。具体的には、またはを呼び出すと、データベースが最初に作成されます (または単に再度開かれます) getWritableDatabase()。これらの 2 つの方法:

  • 変数を定義する(およびコールバック メソッドにSQLiteDatabase db渡す制御)db
  • dbメソッドを呼び出すonCreate(db)か、既存のデータベースを開いて初期化します
  • バージョン番号を確認し、必要に応じてonUpgrade(db)またはに電話してくださいonDowngrade(db)

onConfigure(db)また、onOpen(db)、 などのいくつかのコールバック メソッドも呼び出します(これらのメソッドについて詳しくはこちらを参照してください)。参考になる場合は、ソース コードを自分で読んで、これらすべてがいつ、どのように発生するかの構造を理解してください。

于 2012-09-03T20:33:39.740 に答える
1

onCreate() メソッドは、このクラスのコンストラクタではありません。onCreate は、DB を作成するときに呼び出されます。

ここで、PeopleDB は SQLiteOpenHelper を拡張します。このコードは別のクラスのものであり、getWritableDatabase() または getReadableDatabase() が呼び出されたときに onCreate が呼び出されます。

  PeopleDB db = null; //onCreate NOT called here
  db=new PeopleDB(getContext());
  db.getWritableDatabase();  //onCreate is called here!

それが役立つことを願っています。

于 2012-09-03T20:40:08.170 に答える
1

データベースが、オーバーライドされた onCreate メソッドではなく、openhelper のコンストラクター自体で作成されていることを確認してください。onCreate メソッド内で、オープン ヘルパーのコンストラクターで作成されたデータベースにテーブルを作成するためのクエリを起動して、データベースを作成せずにデータを挿入します。

もう 1 つは、SQLiteDatabase オブジェクトが SQLiteOpenHelper クラスでインスタンス化されていないことです。データベースを使用してデータベース操作を実行するクラスでインスタンス化され、データベースを初期化または開いて挿入の準備をするために、このような関数を記述する必要があります。

SQLiteDatabase database;

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that

    public void open() throws SQLException {
            database = profiloHelper.getWritableDatabase();
        }

これは、挿入削除などのデータベース内の操作のために作成する必要があるコードです。クエリを変更するだけです

SQLiteStatement insert_stmt = null;

        try {
            insert_stmt = database.compileStatement(YOUR_QUERY);

            insert_stmt.bindString(1,   field1);
            insert_stmt.bindString(2,   field2);
            insert_stmt.executeInsert();
        }
        finally {
            if (insert_stmt != null) insert_stmt.close();
        }
于 2012-09-03T20:48:07.660 に答える
0

おそらく、getReadableDatabase()彼らgetWriteableDatabase()が初めて呼び出されたとき


于 2012-09-03T20:33:35.247 に答える
0

onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int)、およびオプションで onOpen(SQLiteDatabase) を実装するサブクラスを作成します。このクラスは、データベースが存在する場合はそれを開き、存在しない場合は作成し、必要に応じてアップグレードします。 . (Android 開発者向け Web サイト)

于 2013-05-02T19:40:43.687 に答える