Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 需要一个好的方法来更改(SQLite)列数据类型_Android_Sqlite - Fatal编程技术网

Android 需要一个好的方法来更改(SQLite)列数据类型

Android 需要一个好的方法来更改(SQLite)列数据类型,android,sqlite,Android,Sqlite,我有一个带有“int”列的表。在软件升级期间,我想将其更改为“long”数据类型。SQLite似乎没有提供更改/修改列属性的选项(在alter语句中)。因为我想升级,所以表中可能包含用户不应该丢失的数据。因此,请向我推荐一种在不丢失数据的情况下更改列数据类型属性的好方法 搜索链接中建议的一种方法是创建临时表,从现有表复制记录,删除现有表,然后重命名临时表。我怀疑这是否有效 谢谢你的帮助 问候 Vivek Ragunahan您可以添加一个新列,将旧列中的值复制到新列中,删除旧列,然后将新列重命名为

我有一个带有“int”列的表。在软件升级期间,我想将其更改为“long”数据类型。SQLite似乎没有提供更改/修改列属性的选项(在alter语句中)。因为我想升级,所以表中可能包含用户不应该丢失的数据。因此,请向我推荐一种在不丢失数据的情况下更改列数据类型属性的好方法

搜索链接中建议的一种方法是创建临时表,从现有表复制记录,删除现有表,然后重命名临时表。我怀疑这是否有效

谢谢你的帮助

问候


Vivek Ragunahan

您可以添加一个新列,将旧列中的值复制到新列中,删除旧列,然后将新列重命名为旧名称

AFAIK在Android中,一旦创建和使用表,就没有办法更改列数据类型。实践的方法是创建一个新表并复制您读到的数据,SQLite3列没有数据类型,只是—将列类型从int更改为long没有任何好处


如果包装程序在将值提供给SQLite3之前截断这些值,那么有一种方法可以通过编辑模式来解决这一问题。这是一个危险的操作,因此只有在备份数据库后才能执行。模式存储在表
sqlite_master
中;通常它是只读的,但若使用pragma启用它,则可以修改它。注意只做不会使数据无效的更改;您可以将
int
更改为
long int
,因为它们都具有整数相关性。

来自SQLite文档

无法重命名列、删除列或添加或删除列 从表中删除约束

请记住,在SQLite中,列数据类型不是严格的

编辑:
根据您对另一个答案的评论,我想您提到的选项(通过临时表工作)是唯一一个效率不高的选项。

我使用以下语句来更改列的类型

CREATE TABLE IF NOT EXISTS **TEMP_TABLE** (id integer primary key autoincrement, **col2change integer not null**, ...)

INSERT INTO TEMP_TABLE SELECT * FROM EXISTING_TABLE

DROP TABLE EXISTING_TABLE

ALTER TABLE TEMP_TABLE RENAME TO EXISTING_TABLE

我将现有表中的int类型列更改为integer类型。对于几百行,它相当快。

但列中的值对int或long敏感。如果不长,插入列中的数据将被截断。在这种情况下,截断值的不是SQLite3本身,而是一个包装器API。请参阅我的答案附录。您是否使用getLong?实际上,我正在插入一个(系统)表,它似乎有一个很长的值。因此,您可以说该场景相当于调用getLong?显示您的代码。您不想更改系统表的架构!这似乎是个好主意,但请参阅上面提到SQLite文档的注释之一。它表示不能重命名或删除列!可以重命名一个表吗?然后,您可以创建一个完整的新表并传输数据。这就是我的问题所在。效率高吗?有没有其他方法可以实现列数据类型的更改?我想这是真的,我正在尝试!