[英]Android adding new field to all records in an sqlite database
我创建了一个使用sqlite数据库保存用户条目(名称和电话号码)的应用。 发布该应用程序的第一个版本后,我决定发布版本2,并将另一个字段添加到数据库(Age)。 不幸的是,人们已经安装了该应用程序,并且每个人都有自己的条目(据我所知,可能是数百个条目)。 现在,当我运行较新的版本时,它崩溃了,因为较旧的条目没有“ Age”字段,并且无法加载记录。 我基本上想要的是在用户更新时运行一段代码,这将为用户已经创建的所有记录在“年龄”字段下添加值0。
我使用了此链接 , 该链接表示要使用此代码ALTER TABLE mytable ADD COLUMN mycolumn TEXT
向数据库添加新列。
而且我使用了此链接 ,它说我必须从database.update("contacts", addContactsAge, "_id=" + id, null);
删除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)
。
删除线
if (oldVersion == 1 && newVersion == 2)'
在onUpgrade
方法中,android自动检测到一个新版本,您要做的就是每当对db进行更改时,在DatabaseOpenHelper
调用中增加该版本,完成后将旧表删除并创建一个新表。
在DatabaseConnector类中更改数据库版本
public DatabaseConnector(Context context) {
databaseOpenHelper = new DatabaseOpenHelper(context, DATABASE_NAME,
null, 2);
}
每当您需要在android应用中更新数据库时,都需要增加数据库版本,它将调用onUpgrade方法,您可以在其中更新数据库。
您也可以尝试此操作,通过预装的db推送应用程序。 使用数据库版本创建数据库,并将其保存在资产文件夹中。 每当应用程序运行时,比较资产数据库和应用程序数据库的版本。 如果资产的数据库版本高于应用程序的数据库,则意味着您需要更新数据库。 直接将资产db复制到文件夹构造函数中,并发送增量调用以获取数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.