你能删除SQLite数据库中的列吗?

时间:2011-07-28 21:07:28

标签: android sqlite

我目前正在处理的Android应用程序动态地将列添加到SQLite数据库。我遇到的问题是我无法找到从数据库中删除这些列的方法。

如果我将A,B,C,D和E列添加到数据库中,以后可以删除C列吗?

我已经做了很多调查,我能找到的最接近的事情是需要构建备份表并将所有列(除了要删除的列)移动到该备份表中的解决方案。

但是,我无法弄清楚我会怎么做。我动态添加所有列,因此它们的名称未在我的Java代码中定义为变量。似乎没有办法使用Android的SQLiteDatabase检索列名。

6 个答案:

答案 0 :(得分:1)

SQLite不支持在其SQL语法中删除列的方法,因此它不太可能出现在包装器API中。 SQLite通常不支持传统数据库支持的所有功能。

您发现的解决方案很有意义并且是实现目标的方法。这是一种丑陋而有效的方法。

您也可以“弃用”这些列,而不是按照惯例在较新版本的应用中使用它们。这样,依赖于C列的旧版应用程序不会中断。

答案 1 :(得分:1)

哦......刚刚注意到这个评论:

  

该应用程序(基本上)是一个考勤跟踪电子表格。你可以加   一个新的“事件”,然后表明参加或没有参加的人。   列是“事件”。

根据该评论,您应该为您的活动创建另一个表,并从其他表链接到该表。您永远不必添加列来支持这样的新域对象。每个逻辑域对象应由其自己的表表示。例如。用户,位置,事件...

最初是写这个。如果你有兴趣,请保留它:

不应动态添加和删除列,而应考虑对数据库中需要动态的部分使用EAV data model

EAV数据模型将值存储为名称/值对,并且db结构永远不需要更改。

答案 2 :(得分:1)

根据您在下面关于为每个事件添加列的评论,我强烈建议创建第二个表,其中每一行代表一个事件,然后通过存储用户行ID和事件ID来跟踪出勤情况排在考勤表中。不断将栏目打到考勤桌上是一种明确的反模式。

答案 3 :(得分:1)

SQLite限制了ALTER TABLE支持,您可以使用该支持将列添加到表的末尾或更改表的名称。

如果要对表的结构进行更复杂的更改,则必须重新创建表。您可以将现有数据保存到临时表,删除旧表,创建新表,然后将数据从临时表中复制回来。

例如,假设您有一个名为" t1"的表。列名称" a"," b"和" c"并且您要删除列" c"从这张桌子。以下步骤说明了如何做到这一点:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

答案 4 :(得分:0)

关于如何查找表模式,您可以按照其他SO问题中的描述查询sqlite_master表 - Is there an SQLite equivalent to MySQL's DESCRIBE [table]?

答案 5 :(得分:0)

根据SQLite FAQ,对ALTER TABLE SQL命令的支持有限。因此,您可以做的唯一方法是,您可以将现有数据保存到临时表,删除旧表,创建新表,然后将数据从临时表中复制回来。

您还可以使用查询从数据库中获取列名。任何查询说“SELECT * FROM”都会给你一个cursor对象。您可以使用方法

String getColumnName(int columnIndex);

String[] getColumnNames();

检索列的名称。