微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查Android SQLite数据库中的特定列

我试图在调用onUpgrade()时检查我的数据库中是否有特定的列.有没有一种简单的方法来检查

if(database does not have specific column){
db.execsql("ALTER TABLE table" + " ADD COLUMN column" );
}

我看到了其他一些答案,Pragma Table,但我不知道如何使用它甚至它真正的用途.

解决方法:

好的,在你遇到更大的问题之前,你应该知道sqlite在ALTER TABLE命令上是有限的,它允许添加重命名删除/删除,这是通过重新创建表来完成的.

您应始终拥有新的表创建查询,并将其用于升级和传输任何现有数据.注意:onUpgrade方法为您的sqlite帮助程序对象运行一个,您需要处理其中的所有表.

那么推荐使用什么升级

> beginTransaction
>运行表创建,如果不存在(我们正在进行升级,因此表可能尚不存在,它将失败更改和删除)
>在列表中放入现有列List< String> columns = dbutils.GetColumns(db,TableName);
>备份表(ALTER表“TableName”RENAME TO’temp_“TableName)
>创建新表(最新的表创建模式)
>获取与新列的交集,这次是从升级后的表中获取的列(columns.retainAll(dbutils.GetColumns(db,TableName));)
>恢复数据(String cols = StringUtils.join(columns,“,”);
            db.execsql(的String.format(
                    “从temp_%s插入%s(%s)SELECT%s”,
                    TableName,cols,cols,TableName));
)
>删除备份表(DROP表’temp_“TableName)
> setTransactionSuccessful

(这不会处理表降级,如果重命名列,则不会因列名不匹配而传输现有数据).

.

public static List<String> GetColumns(sqliteDatabase db, String tableName) {
    List<String> ar = null;
    Cursor c = null;
    try {
        c = db.rawQuery("select * from " + tableName + " limit 1", null);
        if (c != null) {
            ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
        }
    } catch (Exception e) {
        Log.v(tableName, e.getMessage(), e);
        e.printstacktrace();
    } finally {
        if (c != null)
            c.close();
    }
    return ar;
}

public static String join(List<String> list, String delim) {
    StringBuilder buf = new StringBuilder();
    int num = list.size();
    for (int i = 0; i < num; i++) {
        if (i != 0)
            buf.append(delim);
        buf.append((String) list.get(i));
    }
    return buf.toString();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐