我有一个Android数据库SQLite
的问题。如何将新列添加到Android SQLite数据库?
我有一个包含一个field.StudentFname 一个表和应用工作正常了Android 2.3.1,现在如果我添加一个字段,然后我的应用程序不能正常工作。
谁能帮我谁知道数据库的非常好,
我有一个Android数据库SQLite
的问题。如何将新列添加到Android SQLite数据库?
我有一个包含一个field.StudentFname 一个表和应用工作正常了Android 2.3.1,现在如果我添加一个字段,然后我的应用程序不能正常工作。
谁能帮我谁知道数据库的非常好,
您可以在onUpgrade()
方法使用ALTER TABLE
功能,像这样:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// If you need to add a column
if (newVersion > oldVersion) {
db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
}
}
显然,SQLite的将根据列定义不同。
最简单的方法是在SQLiteOpenHelper class
中添加一些SQL to the onUpgrade()
方法。喜欢的东西:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// If you need to add a new column
if (newVersion > oldVersion) {
db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
}
}
我已经尝试过,但仍然无法通过使用alter table方法添加新列在upgrate方法。 – Aamirkhan
嗨!我已经尝试过这我已用在upgrate方法和里面,我已经把alter table查询也是如此。但我仍然无法添加新的列到数据库..但雅当我编写查询添加新列并重命名数据库和表名都比我能够添加新的列......但与alter table方法的帮助,我无法做到这一点..数据库和表不是所需的任务..它应该与改变table..still我不能用alter table方法做 – Aamirkhan
如何增加值如自动增量0,1,2,3,.......... – NagarjunaReddy
当我在自己的应用程序上需要帮助时遇到了这个线程,但看到了许多答案的问题。我建议做以下几点:
private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
+ TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";
private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
+ TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
db.execSQL(DATABASE_ALTER_TEAM_1);
}
if (oldVersion < 3) {
db.execSQL(DATABASE_ALTER_TEAM_2);
}
}
你要确保代码将工作当用户升级1个多版本和更新语句只运行一个升级是必要的。有关更多信息,请查看blog。
如果我们想用默认的String值创建更改的列,该怎么办? –
我读过的最好的解决方案和漂亮的博客btw! – MrBrightside
也许稍微更优雅的方式使用开关来代替的if/then将从任何模式到最近的模式升级...
这里也对语法一个体面的页面更改表:http://alvinalexander.com/android/sqlite-alter-table-syntax-examples
public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";
private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
+ TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";
private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
+ TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion)
{
case 1:
//upgrade from version 1 to 2
db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
case 2:
//upgrade from version 2 to 3
db.execSQL(DATABASE_ALTER_TEAM_TO_V3);
//and so on.. do not add breaks so that switch will
//start at oldVersion, and run straight through to the latest
}
}
我认为我们不应该检查类似的
if (newVersion > oldVersion) {
}
条件,因为如果我们用这个,这意味着每次当我们增量值时间ASE数据库版本,那么onUpdrade()将调用和条件将是真实的,所以我们应该检查这样的
if(oldVersion==1)
{
}
所以在这种情况下,如果旧版本是2,那么情况将是错误的和用户与旧版本2将不更新数据库(哪个用户只想要版本1),因为对于那些用户数据库已经更新。
我在搜索相同问题时遇到了链接。它解释了如何使用升级。 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
它解释了为什么使用这个下面的代码
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
db.execSQL(DATABASE_ALTER_TEAM_1);
}
if (oldVersion < 3) {
db.execSQL(DATABASE_ALTER_TEAM_2);
}
}
最简单的方法在表上创建一个新列添加一些SQL到SQLiteOpenHelper类onUpgrade()方法。像:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(SQL_MY_TABLE);
case 2:
db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
}
}
要添加一个新列到表中,您需要使用ALTER
。在android中,您可以在onUpgrade()
内添加新列。
您可能会奇怪,onUpgrade()
将如何添加新列?
当您实现SQLiteOpenHelper
的子类时,需要在您的类构造函数中调用超类的构造函数:super(context, DB_NAME, null, 1);
。那里我通过了1
的版本。
当我将版本1
更改为以上(2
或更高)时,将调用onUpgrade()
。并执行我打算执行的SQL修改。 我的类的构造改变后的版本:像这样
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 2);//version changed from 1 to 2
}
SQL的修改检查,父类的构造与我传递给super()
版本存储的SQLite数据库文件的版本进行比较。如果这些(先前和现在)版本号不同,则调用onUpgrade()
。
代码应该是这样的:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// add new columns to migrate to version 2
if (oldVersion < 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
}
// add new columns to migrate to version 3
if (oldVersion < 3) {
db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
}
}
我做了以下的方法,它是来拆分为我
如果DB版本:6
Ex : There is a table with 5 columns
当你升级至:7(我在3张表中添加了1个新列)
1. We need to add the columns when creating a table
2. onUpgrade method:
if (oldVersion < 7)
{
db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
db.execSQL(DATABASE_ALTER_PAPER_LABEL);
}
其中:“DATABASE_ALTER_ADD_PAPER_PAID”是查询。
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
+ TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
上述后两种操作它会正常工作的全新安装的用户和应用程序升级用户
喜!我已经尝试过这我已用在upgrate方法和里面,我已经把alter table查询也是如此。但我仍然无法添加新的列到数据库..但雅当我编写查询添加新列并重命名数据库和表名都比我能够添加新的列......但与alter table方法的帮助,我无法做到这一点..数据库和表不是所需的任务..它应该与改变table..still我不能用alter table方法做到这一点.. – Aamirkhan
如何增加值,如0,1,2,3,.......... – NagarjunaReddy
@NagarjunaReddy对于迟到的回复抱歉。 您可以使用此方法 db.execSQL(“UPDATE table SET key = key + 1 WHERE name =?”,new String [] {name}); – DevYudh