在android中升级数据库时恢复数据

时间:2014-01-03 17:14:54

标签: android

我开发了一个应用程序,我有一个数据库 当我用新列升级数据库时,我丢失了数据 我创建了两个表,现在如果我想添加新列怎么办?我应该改变桌子还是应该丢弃并重新创建它?如果我改变表格,我会丢失数据吗?

这是数据库类:

public class data extends SQLiteOpenHelper {
    static String dbName="furniture_info.db";
    static String logintable="login";
    static String rowid="log_masterid";
    static String UID="email_id";
    static String passw="password";
    static String flag="active_flag";
    static String cName="username";
    static String Age="age";
    static String colDept="dept";
    static String sid="std_id";
    static String stinfo="stdinfo";
    static String sname="name";
    static String phone="phno";
    static String city="user_city";
    static String state="user_state";
    static String pincode="user_pincode";
    static String user_id="user_id";
    static String user_info="user_info";



     public data(Context con) {
        // TODO Auto-generated constructor stub
        super(con,dbName,null,11);
     }
        @Override
        public void onCreate(SQLiteDatabase db)
        {

            boolean a=checkDataBase();
            if(a==false)
            {
                String stmt="CREATE TABLE "+logintable+" ("+rowid+" INTEGER PRIMARY KEY, "
                        +UID+ " TEXT, "+ passw + " TEXT, "+ cName +" TEXT, "+ phone +" INTEGER, "+flag+" INTEGER "+")";
            //String stmt="CREATE TABLE "+colltable+" ("+colID+ " TEXT PRIMARY KEY,"+")";
                db.execSQL(stmt);
                String stm="CREATE TABLE user_info (" + user_id +" INTEGER, "+ city +" TEXT, "+ state +" TEXT, "+ pincode + " INTEGER , foreign key ("+ user_id +") references "+ logintable+"("+ rowid +") )";
                db.execSQL(stm);
            }
            //db.execSQL("CREATE TABLE "+ stinfo +" ("+sname+ " TEXT, " +Age+ " TEXT, "+ phone +" TEXT " +sid+" INTEGER NOT NULL ,FOREIGN KEY ("+sid+") REFERENCES  "+colltable+" ("+sid+"));");
//          Toast.makeText(null, "table created", Toast.LENGTH_LONG).show();


        }

        @Override
        public void onUpgrade(SQLiteDatabase db,int oldv,int newv)
        {


                //final String ALTER_TBL = "ALTER TABLE " + logintable +" ADD COLUMN"+ passw+" text,"+flag+"INTEGER;";

            // deleteDatabase(dbName);
             //Toast.makeText(null, "database deleted", Toast.LENGTH_LONG).show();
            //File dbFile =new File(getDatabasePath(dbName));
            //db.deleteDatabase(dbFile);
            db.execSQL("DROP TABLE IF EXISTS " + logintable);    
            onCreate(db);
}
        private boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            try {
                checkDB = SQLiteDatabase.openDatabase("//data/data/com.furniture/databases/furniture_info.db", null,
                        SQLiteDatabase.OPEN_READONLY);
                checkDB.close();
            } catch (SQLiteException e) {
                // database doesn't exist yet.
            }
            return checkDB != null ? true : false;
        }

我知道当我增加数据库的版本号时它会升级,但问题是我丢失了数据。

2 个答案:

答案 0 :(得分:0)

您正在丢失数据,因为在onUpgrade(...)中您正在删除该表,然后从头开始重新创建它。如果要在不删除表的情况下更改表,可以使用ALTER TABLE SQL命令。看起来你已经在某个时刻已经有了这个,但出于某种原因对它进行了评论。

答案 1 :(得分:0)

更改表格不会影响其中的任何数据。增加数据库版本,比较onUpgrade中的旧版本号和新版本号,并相应地执行alter SQL(或您需要应用的任何其他SQL)。通过比较旧版本和新版本是什么,您可以确定需要进行哪些更新才能使现有数据库达到当前架构定义。

使用ALTER需要注意的一件事是添加一个约束为NOT NULL的列。如果表中存在行但是可以解决这个问题,那将会失败。但是在这种情况下,我无法看到任何类似的问题。