如何将新列添加到Android SQLite数据库?

问题描述:

我有一个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的将根据列定义不同。

+1

喜!我已经尝试过这我已用在upgrate方法和里面,我已经把alter table查询也是如此。但我仍然无法添加新的列到数据库..但雅当我编写查询添加新列并重命名数据库和表名都比我能够添加新的列......但与alter table方法的帮助,我无法做到这一点..数据库和表不是所需的任务..它应该与改变table..still我不能用alter table方法做到这一点.. – Aamirkhan

+0

如何增加值,如0,1,2,3,.......... – NagarjunaReddy

+0

@NagarjunaReddy对于迟到的回复抱歉。 您可以使用此方法 db.execSQL(“UPDATE table SET key = key + 1 WHERE name =?”,new String [] {name}); – DevYudh

最简单的方法是在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"); 
    } 
} 
+0

我已经尝试过,但仍然无法通过使用alter table方法添加新列在upgrate方法。 – Aamirkhan

+0

嗨!我已经尝试过这我已用在upgrate方法和里面,我已经把alter table查询也是如此。但我仍然无法添加新的列到数据库..但雅当我编写查询添加新列并重命名数据库和表名都比我能够添加新的列......但与alter table方法的帮助,我无法做到这一点..数据库和表不是所需的任务..它应该与改变table..still我不能用alter table方法做 – Aamirkhan

+0

如何增加值如自动增量0,1,2,3,.......... – NagarjunaReddy

@ Aamirkhan.i认为你会解决你在评论中提到长回来ago.i认为你并没有增加数据库的版本问题。否则这里的答案是直截了当的。我正在写这篇文章,因为它可以帮助那些在更改表格时没有增加或更改其数据库版本号的人。

+0

是的,更改数据库名称和unistalling应用程序,并重新安装它将解决问题 – Aamirkhan

+0

@Aamirkhan,请将支票移动到下一个答案,所以更清晰的解决方案是可用的公众。 – AlleyOOP

当我在自己的应用程序上需要帮助时遇到了这个线程,但看到了许多答案的问题。我建议做以下几点:

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

+0

如果我们想用默认的String值创建更改的列,该怎么办? –

+3

我读过的最好的解决方案和漂亮的博客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 

    } 

} 
+0

这是处理多个升级的方法。检查哪个版本来自! – Ricardo

+0

如果您直接从版本1升级到版本3(如果有人不自动更新应用),则不会到达案例2. – TyMarc

+0

@ TyMarc--是的,它将升级到版本2,然后是3.交换机使用旧版本。因此,在您的示例中,旧版本为1.代码将运行第1种情况,即从版本1升级到第2版,然后运行第2种情况(因为没有中断;),从2升级到3。在描述中,这些都是正确的。 –

我认为我们不应该检查类似的

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;"; 

上述后两种操作它会正常工作的全新安装的用户和应用程序升级用户