我创建了一个使用sqlite数据库来保存用户的应用程序'条目(姓名和电话号码)。在发布此应用程序的第一个版本后,我决定发布版本2并向数据库添加另一个字段(Age)。不幸的是,人们已经安装了应用程序并且各自创建了自己的条目(对于我所知的所有条目,可能是数百个条目)。现在,当我运行新版本时,它崩溃了,因为较旧的条目没有"年龄"字段并且无法加载记录。我基本上想要的是在用户更新时运行一段代码,这将在字段" Age"下添加值0。对于用户已创建的所有记录。
我使用了this link,它说要使用此代码ALTER TABLE mytable ADD COLUMN mycolumn TEXT
向数据库添加新列。
我已经使用了this link,它说我必须从where
中删除database.update("contacts", addContactsAge, "_id=" + id, null);
子句,以便更新所有记录。
我已经应用了所有这些,但是当我启动新版本时,它会立即崩溃。
以下是我的完整更新代码:
public class DatabaseConnector {
private static final String DATABASE_NAME = "UserContacts";
private SQLiteDatabase database;
private DatabaseOpenHelper databaseOpenHelper;
public DatabaseConnector(Context context) {
databaseOpenHelper = new DatabaseOpenHelper(context, DATABASE_NAME,
null, 2);
}
public void open() throws SQLException {
database = databaseOpenHelper.getWritableDatabase();
}
public void close() {
if (database != null)
database.close();
}
public void insertContact(String name, String phone, String age) {
ContentValues newContact = new ContentValues();
newContact.put("name", name);
newContact.put("phone", phone);
newContact.put("age", age);
open();
database.insert("contacts", null, newContact);
close();
}
public void updateContact(long id, String name, String phone, String age) {
ContentValues editContact = new ContentValues();
editContact.put("name", name);
editContact.put("phone", phone);
editContact.put("age", age);
open();
database.update("contacts", editContact, "_id=" + id, null);
close();
}
public void setContactsAge() {
ContentValues addContactsAge = new ContentValues();
addContactsAge.put("age", "0");
open();
database.update("contacts", addContactsAge, null, null);
close();
}
public Cursor getAllContacts() {
return database.query("contacts",
new String[] { "_id", "name" }, null, null, null, null,
"name");
}
public Cursor getOneContact(long id) {
return database.query("contacts", null, "_id=" + id, null, null, null,
null);
}
public void deleteContact(long id) {
open();
database.delete("contacts", "_id=" + id, null);
close();
}
private class DatabaseOpenHelper extends SQLiteOpenHelper {
public DatabaseOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createQuery = "CREATE TABLE contacts"
+ "(_id integer primary key autoincrement,"
+ "name TEXT, phone TEXT, age TEXT);";
db.execSQL(createQuery);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1 && newVersion == 2)
database.execSQL("ALTER TABLE contacts ADD COLUMN age TEXT");
}
}
}
MainActivity.java:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = preferences.edit();
int i = preferences.getInt("numberoflaunches", 1);
if (i < 2) {
DatabaseConnector databaseConnector = new DatabaseConnector(MainActivity.this);
databaseConnector.setContactsAge();
i++;
editor.putInt("numberoflaunches", i);
editor.commit();
}
}
}
就像我说这段代码对我不起作用,我也不知道问题是什么。任何帮助将不胜感激。
我已将数据库版本更改为2,但没有运气。我还尝试删除if (oldVersion == 1 && newVersion == 2)
。
答案 0 :(得分:0)
删除行
if (oldVersion == 1 && newVersion == 2)'
在onUpgrade
方法中,android会自动检测到一个新版本,所有你需要做的就是在你对db进行更改时增加DatabaseOpenHelper
调用中的版本,完成后再删除旧表并且创建了新的。
答案 1 :(得分:0)
在DatabaseConnector类中更改db版本
public DatabaseConnector(Context context) {
databaseOpenHelper = new DatabaseOpenHelper(context, DATABASE_NAME,
null, 2);
}
每当你需要在Android应用程序中更新你的数据库时,你需要增加你的数据库版本,它将调用onUpgrade方法,你可以更新你的数据库。
您也可以尝试使用预先安装的数据库推送应用。使用db版本创建数据库并将其保存在assets文件夹中。每当应用运行时,比较资产版本的db&amp;应用程序的数据库。如果资产的db版本高于应用程序的db,那么这意味着您需要更新数据库。直接将资产db复制到文件夹结构中,并发送delta调用以获取数据。