0

このチュートリアルを使用して、AndroidでSqliteを使用する方法を学んでいます。一部のコードを理解するのに問題があります。

  public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

アクティビティでDatabaseHandlerの新しいオブジェクトを作成します。コンストラクターのスーパーはSQLiteOpenHelperコンストラクターです。コードはうまく機能し、データベースがない場合は新しいデータベースを作成し、存在する場合は古いデータベースを使用します。このコードにいくつかの変更を加えたい(1つのデータベースに異なるテーブルを追加したい)が、これがどのように正確に機能するのか、コンストラクターが新しいデータベースを作成するか既存のデータベースを使用するかをどのように知るのかわかりません。

4

2 に答える 2

3

秘訣は、クラスがSQLiteOpenHelperを拡張することsuperです。コンストラクターでの呼び出しは、多くの舞台裏のコードをトリガーします。

SQLiteOpenHelperのソースコードを読むと、それがわかり、同じメソッドgetWritableDatabase()を呼び出すことができます。このメソッドはほとんどの作業を行います。これは、1つの簡単なコマンドで指定した情報から、データベースを作成、開く、アップグレードする必要があるかどうかを判断するものです。getReadableDatabase()SQLiteOpenHelper#getDatabaseLocked()super(context, DATABASE_NAME, null, DATABASE_VERSION);

于 2012-11-17T21:13:28.780 に答える
2

dbを開きたい場合は、SQLiteOpenHelper.getReadableDatabase()またはSQLiteOpenHelper.getWriteableDatabase()を呼び出します。データベースが存在する場合、これらはデータベースへのハンドルを返します。存在しない場合、システムはonCreate()を呼び出し、ここでdb.execSQLを実行します。

DatabaseHandlerの代わりにクラスDatabaseOpenHelperを呼び出す方がよいでしょう。他のクラスの最初にデータベースを作成するのではなく、必要になるまでデータベースの作成を延期します。これは、SQLiteデータベースに支えられたコンテンツプロバイダーにとって特に便利です。ContentProvider.onCreate()を使用して非常に迅速な初期化を行ってから、SQLiteOpenHelper.onCreate()を実装してデータベースを作成する必要があります。そうすれば、システムはアプリの起動時にContentProviderをロードできますが、何かがデータベースにアクセスしようとするまで、データベースに対して何もする必要はありません。

于 2012-11-17T21:47:38.693 に答える