我开发了一个应用程序,我有一个数据库 当我用新列升级数据库时,我丢失了数据 我创建了两个表,现在如果我想添加新列怎么办?我应该改变桌子还是应该丢弃并重新创建它?如果我改变表格,我会丢失数据吗?
这是数据库类:
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;
}
我知道当我增加数据库的版本号时它会升级,但问题是我丢失了数据。
答案 0 :(得分:0)
您正在丢失数据,因为在onUpgrade(...)
中您正在删除该表,然后从头开始重新创建它。如果要在不删除表的情况下更改表,可以使用ALTER TABLE
SQL命令。看起来你已经在某个时刻已经有了这个,但出于某种原因对它进行了评论。
答案 1 :(得分:0)
更改表格不会影响其中的任何数据。增加数据库版本,比较onUpgrade中的旧版本号和新版本号,并相应地执行alter SQL(或您需要应用的任何其他SQL)。通过比较旧版本和新版本是什么,您可以确定需要进行哪些更新才能使现有数据库达到当前架构定义。
使用ALTER需要注意的一件事是添加一个约束为NOT NULL的列。如果表中存在行但是可以解决这个问题,那将会失败。但是在这种情况下,我无法看到任何类似的问题。