繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM