Android为sqlite数据库中的所有记录添加新字段

时间:2015-06-28 15:15:01

标签: android android-sqlite

我创建了一个使用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)

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调用以获取数据。