1

Androidでアプリケーションを作成し、SQliteデータベースを使用しています。ユーザーの選択により、テーブルに列を追加できるようにしたいと考えています。そのため、ユーザーは必要な列をテーブルに追加できます。たとえば、ユーザーが「動物」テーブルを持っていて、「犬」、「猫」、「魚」の列を追加したいとします。

私はいくつかの解決策について読みましたが、私を助けることができるものを見ませんでした。列を追加する簡単な方法は次を使用していることを読みました:

        @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // If you need to add a column
        if (newVersion > oldVersion) {
            db.execSQL("ALTER TABLE " + TableName + " ADD COLUMN " + ColumnName);
        }
}

しかし、これに関する私の問題は、ユーザーの選択によってテーブルに追加される列の名前を選択できないということです。文字列のパラメーターはありません。だから私はこのようなものを使って、それを直接呼び出してみました。

        @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion, String newColumnName) {

        // If you need to add a column
        if (newVersion > oldVersion) {
            db.execSQL("ALTER TABLE " + TableName + " ADD COLUMN " + newColumnName);
        }
}

しかし、この方法ではエラーが発生しました。

データベースのバージョンについて別の質問があります。onCreate が呼び出されると、onUpgrade メソッドが自動的に呼び出されます。onUpgrade には、データベース バージョンの oldVersion および newVersion パラメータがあります。oldVersion および newVersion パラメータはいつ設定するのですか? newVersion パラメータを 2,3,4... に設定するにはどうすればよいですか?

4

2 に答える 2

1

追加の列データを保持する補助テーブルを作成できます。プライマリ テーブルへのクエリは、新しいビューでのクエリに変換できます。

create table if not exists animal (pk integer primary key, name);

create table if not exists animal_aux (animal_pk, col_name, col_val);

create view if not exists animal_view
    as select animal.name as name,
              ct.col_val as cat,
              dt.col_val as dog
        from animal, animal_aux as ct, animal_aux as dt
        where animal.pk = ct.animal_pk
          and animal.pk = dt.animal_pk
          and ct.col_name = 'cat'
          and dt.col_name = 'dog'
;

このスキーマは、主キーを作成するように拡張する必要があります。animal_pk, col_name少なくとも. テーブルにエントリを挿入または削除するときに、補助テーブルにエントリを追加または削除するためのトリガーも必要になる場合があります。uniqueanimal_auxanimal

例:

sqlite> select * from animal_view;
sqlite> insert into animal values (NULL, 'fred');
sqlite> select * from animal_view;
sqlite> select * from animal;
1|fred
sqlite> insert into animal_aux values (1, "dog", "beagle");
sqlite> insert into animal_aux values (1, "cat", "siamese");
sqlite> select * from animal_view;
fred|siamese|beagle
sqlite> 

仮想列を追加するたびに、

drop view animal_view;

次に、適切な追加の列とwhere句を使用して再作成します。

于 2013-05-01T18:26:32.290 に答える
0

final static String Database_name="empDb.db";

public DatabaseHelper(Context context) {
    super(context, Database_name, null, 1);
}
@Override    public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table emp_tbl (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,salary TEXT)");
}

@Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS tbl_emp");
}

ブログ: https://itmulc.blogspot.com/2016/08/android-sqlite-database-with-complete.html 詳細についてはこちらをご覧ください。 https://www.youtube.com/watch?v=W8-Z85oPNmQ

于 2016-08-10T21:11:16.123 に答える