如何使用Android SQLite数据库制作动态列

时间:2013-05-01 17:28:12

标签: android sqlite

我正在使用SQlite数据库在Android上编写应用程序。 我希望能够通过用户选择将列添加到我的表中。 因此用户可以添加他想要的任何列到表。例如,用户有“动物”表,他想为“狗”,“猫”和“鱼”添加列。

我已经阅读了一些解决方案,但我没有看到一个可以帮助我的方案。 我读到添加列的简单方法是使用:

        @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 ......?

2 个答案:

答案 0 :(得分: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成为主键,或unique中至少animal_aux。当您在animal表中插入或删除条目时,您可能还需要触发器来在aux表中添加或删除条目。

示例:

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子句重新创建它。

答案 1 :(得分:0)

final static String Database_name =" empDb.db&#34 ;;

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