【问题标题】:Android upgrading SQLite - table not modifiedAndroid 升级 SQLite - 表未修改
【发布时间】:2014-01-03 21:22:45
【问题描述】:

我在升级 SQLite 时遇到问题。我正在使用 SQLiteOpenHelper,我只是添加了一列,更改了数据库版本,但问题是,新列没有显示(没有制作)。据我所见,正确调用了 OnCreate 和 OnUpgrade ,但我不知道为什么不制作新表。我只在表“smeri”中添加了最后一列“在线”

public class DatabaseHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 16;

// Database Name
private static final String DATABASE_NAME = "RasicaDB";

// Contacts table name
private static final String TABLE_NAME_mainpoints = "mainpoints";
private static final String TABLE_NAME_smeri = "smeri";
private static final String TABLE_NAME_povezave = "povezave";

// Contacts Table Columns names
private static final String KEY1_ID = "ID";
private static final String KEY1_X = "X";
private static final String KEY1_Y = "Y";

private static final String KEY2_ID = "ID";
private static final String KEY2_ime = "Ime";
private static final String KEY2_tezavnost = "Tezavnost";
private static final String KEY2_opis = "Opis";
private static final String KEY2_avtor = "Avtor";
private static final String KEY2_datum = "Datum";
private static final String KEY2_online = "Online";

private static final String KEY3_IDsmeri = "IDsmeri";
private static final String KEY3_IDtocke = "IDtocke";
private static final String KEY3_vrstaTocke = "vrstaTocke";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.e("log_tag", "ON CREATE!!!!!!!!");

    String CREATE_mainpoints_TABLE = "CREATE TABLE " + TABLE_NAME_mainpoints + "("
            + KEY1_ID + " INTEGER PRIMARY KEY,"
            + KEY1_X + " INTEGER,"
            + KEY1_Y + " INTEGER" + ")";
    db.execSQL(CREATE_mainpoints_TABLE);


    String CREATE_smeri_TABLE = "CREATE TABLE " + TABLE_NAME_smeri + "("
            + KEY2_ID + " INTEGER PRIMARY KEY,"
            + KEY2_ime + " TEXT,"
            + KEY2_tezavnost + " TEXT,"
            + KEY2_opis + " TEXT,"
            + KEY2_avtor + " TEXT,"
            + KEY2_datum + " TEXT,"
            + KEY2_online + " INTEGER" + ")";
    Log.e("log_tag", ""+CREATE_smeri_TABLE);
    db.execSQL(CREATE_smeri_TABLE);

    String CREATE_povezave_TABLE = "CREATE TABLE " + TABLE_NAME_povezave + "("
            + KEY3_IDsmeri + " INTEGER,"
            + KEY3_IDtocke + " INTEGER,"
            + KEY3_vrstaTocke + " INTEGER " + ")";
    db.execSQL(CREATE_povezave_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    Log.e("log_tag", "ON UPGRADE!!!!!!!!");
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_mainpoints);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_smeri);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_povezave);

    // Create tables again
    onCreate(db);
}

【问题讨论】:

    标签: android sqlite upgrade


    【解决方案1】:

    使用此代码:

     public class DatabaseHandler extends SQLiteOpenHelper {
    
            private static final int DATABASE_VERSION = 16;
    
            // Database Name
            private static final String DATABASE_NAME = "RasicaDB";
    
            // Contacts table name
            private static final String TABLE_NAME_mainpoints = "mainpoints";
            private static final String TABLE_NAME_smeri = "smeri";
            private static final String TABLE_NAME_povezave = "povezave";
    
            // Contacts Table Columns names
            private static final String KEY1_ID = "ID";
            private static final String KEY1_X = "X";
            private static final String KEY1_Y = "Y";
    
            private static final String KEY2_ID = "ID";
            private static final String KEY2_ime = "Ime";
            private static final String KEY2_tezavnost = "Tezavnost";
            private static final String KEY2_opis = "Opis";
            private static final String KEY2_avtor = "Avtor";
            private static final String KEY2_datum = "Datum";
            private static final String KEY2_online = "Online";
    
            private static final String KEY3_IDsmeri = "IDsmeri";
            private static final String KEY3_IDtocke = "IDtocke";
            private static final String KEY3_vrstaTocke = "vrstaTocke";
    
            public DatabaseHandler(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                Log.e("log_tag", "ON CREATE!!!!!!!!");
    
                String CREATE_mainpoints_TABLE = "CREATE TABLE " + TABLE_NAME_mainpoints + "("
                        + KEY1_ID + " INTEGER PRIMARY KEY,"
                        + KEY1_X + " INTEGER,"
                        + KEY1_Y + " INTEGER" + ")";
                db.execSQL(CREATE_mainpoints_TABLE);
    
    
                String CREATE_smeri_TABLE = "CREATE TABLE " + TABLE_NAME_smeri + "("
                        + KEY2_ID + " INTEGER PRIMARY KEY,"
                        + KEY2_ime + " TEXT,"
                        + KEY2_tezavnost + " TEXT,"
                        + KEY2_opis + " TEXT,"
                        + KEY2_avtor + " TEXT,"
                        + KEY2_datum + " TEXT,"
                        + KEY2_online + " INTEGER" + ")";
                Log.e("log_tag", ""+CREATE_smeri_TABLE);
                db.execSQL(CREATE_smeri_TABLE);
    
                String CREATE_povezave_TABLE = "CREATE TABLE " + TABLE_NAME_povezave + "("
                        + KEY3_IDsmeri + " INTEGER,"
                        + KEY3_IDtocke + " INTEGER,"
                        + KEY3_vrstaTocke + " INTEGER " + ")";
                db.execSQL(CREATE_povezave_TABLE);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // Drop older table if existed
                try{
                    if(oldVersion<16){
                        db.execSQL("ALTER TABLE " + TABLE_NAME_smeri +" ADD column "+KEY2_online+ " INTEGER "); 
                    }   
                }catch(SQLException e){
                    e.printStackTrace();
                }
    
                }
            }
    

    【讨论】:

      【解决方案2】:

      确保将表名放在引号中

      db.execSQL("DROP TABLE IF EXISTS '" + TABLE_NAME_mainpoints +"'");

      【讨论】:

      • 试过了,不工作:/当升级发生时,所有表都被删除了,但是它们以与以前相同的方式创建,即使我评论了一个表的整个创建过程,它仍然被创建:s
      • 好吧,我也认为:s 找不到问题
      • 你确定你修改的代码实际上正在运行吗?如果表被删除然后重新创建但使用旧模式,那么听起来你只是在运行旧版本的应用程序。我建议您修改您的 Log.e 以包含一些新内容,以便您确定您的代码正在运行。您还可以在清单 xml 中添加版本编号,我经常使用它来确保我知道哪个版本正在运行。
      • 当我的代码不再工作时,我做了那个 Log.e 语句,所以是的,这段代码正在运行。
      【解决方案3】:

      你可以试试加栏

      db.execSQL("alter table smeri add column Online int");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2013-06-20
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        相关资源
        最近更新 更多