2011-06-29 45 views
0

每次手机重新启动时都会调用onUpgrade方法,我可以看到onUpgrade中的oldVersion参数永远不会被调用。我试图卸载应用程序,但没有成功。奇怪的是,oldVersion总是6.或者还有其他原因,为什么每次手机重新启动时我的数据库都没有了?Android SQLite无法升级数据库

private static final int DATABASE_VERSION = 7; 

private static class DatabaseHelper extends SQLiteOpenHelper { 
    /** 
    * jdbc Constructor. 
    * 
    * @param context 
    */ 

    Context mContext; 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mContext = context; 

    } 

    /** 
    * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase) 
    */ 
    public void onCreate(SQLiteDatabase db) { 
     LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter"); 
     try { 
     db.execSQL(DATABASE_CREATE_1); 
     db.execSQL(DATABASE_CREATE_2); 
     db.execSQL(DATABASE_CREATE_3); 
     db.execSQL(DATABASE_CREATE_4); 
     db.execSQL(DATABASE_CREATE_5); 
     } catch (Exception e) { 
     logger.error("Unable to query database", e); 
     } 
    } 

    /** 
    * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, 
    *  int, int) 
    */ 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter"); 
     String version = "oldVersion " + Integer.toString(oldVersion) + " newVersion " 
     + Integer.toString(newVersion); 
     LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), version); 


     if (newVersion > oldVersion) { 
     try { 
      //DROP OLD 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_1); 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_2); 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_3); 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_4); 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_5); 
      //CREATE NEW 
      onCreate(db); 
     } catch (Exception e) { 
      e.toString(); 
     } 
     } 

    } 
    } 

解决 所以它看起来好像他们是无所事事的构造,但搬到一切都变成initialize方法。

Class Store { 
public Store() { 
    db = null; 
    table = new HashMap<String, String>(); 
    } 

public void initialize(Context context) throws SQLException { 
    if (db == null) { 
     dbHelper = new DatabaseHelper(context); 
     db = dbHelper.getWritableDatabase(); 
    } 
    } 
} 

他们这样做是因为他们使用一个工厂,如果不存在的话,只会创建存储的单一实例,但他们无法从工厂的上下文。所以他们所做的就是从其中一个活动中调用初始化方法。所以通过将这些东西移动到构造函数中,并删除所有的初始化方法。我注意到初始化方法是从多个地方调用的。如果我理解正确,那么调用getWritableDatabase多少次并不重要,因为数据库是单例正确的?

所以我的问题是,即使这可能不是最佳实践,为什么这不起作用?

类商店{ public Store(上下文上下文)dbHelper = new DatabaseHelper(context); db = dbHelper.getWritableDatabase(); }}

回答

0

更改此:

} catch (Exception e) { 
     e.toString(); 
    } 

要这样:

} catch (Exception e) { 
     logger.error("Unable to upgrade database", e); 
    } 

印刷应该解释一下你的问题的堆栈跟踪。如果没有,请将它张贴在这里,我们来看看。 :-)

+0

虽然没有得到异常? – user629126

+0

你怎么知道?你做了我建议的改变并再次运行应用程序? – plowman

+0

好吧,我想我有问题修复。它必须与调用dbhelper的类相关。我稍后会分享这个问题。谢谢 – user629126