我目前正在处理的Android应用程序动态地将列添加到SQLite数据库。我遇到的问题是我无法找到从数据库中删除这些列的方法。
如果我将A,B,C,D和E列添加到数据库中,以后可以删除C列吗?
我已经做了很多调查,我能找到的最接近的事情是需要构建备份表并将所有列(除了要删除的列)移动到该备份表中的解决方案。
但是,我无法弄清楚我会怎么做。我动态添加所有列,因此它们的名称未在我的Java代码中定义为变量。似乎没有办法使用Android的SQLiteDatabase检索列名。答案 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)