【问题标题】:Restoring data while upgrading database in android在android中升级数据库时恢复数据
【发布时间】:2014-01-03 17:14:53
【问题描述】:

我已经开发了一个应用程序并且我有一个数据库。
当我使用新列升级数据库时,我会丢失其中的数据。
我创建了两个表,现在如果我想添加新列怎么办?我应该更改表还是应该删除并重新创建它?如果我只是更改表会丢失数据吗?

这是数据库类:

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    您正在丢失数据,因为在onUpgrade(...) 中您正在删除表,然后从头开始重新创建它。如果要更改表而不删除它,可以使用ALTER TABLE SQL 命令。看起来您曾经有过这样的设置,但出于某种原因将其注释掉了。

    【讨论】:

    • 谢谢你的尝试:)
    【解决方案2】:

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

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

    【讨论】:

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