简体   繁体   English

在SQLite数据库中添加新列

[英]Adding a new column in SQLite Database

I am pretty new to Android development and I am trying to implement a database for my app. 我是Android开发的新手,正在尝试为我的应用程序实现数据库。 I started with only having one column in the database (COLUMN_DATE) and then added another column (COLUMN_REPEAT). 我首先在数据库中只有一列(COLUMN_DATE),然后添加了另一列(COLUMN_REPEAT)。 This worked fine and printed the results as expected. 这样工作正常,并按预期打印结果。 However, when I tried adding another column (COLUMN_ACCOUNT), printDatabase() in MainActivity did not print anything. 但是,当我尝试添加另一列(COLUMN_ACCOUNT)时,MainActivity中的printDatabase()无法打印任何内容。 I understand you can view what is in your database by using Android Device Monitor, but I keep getting an error when I click on that so I cannot use it (That is a separate issue which I haven't been able to solve). 我了解您可以使用Android Device Monitor查看数据库中的内容,但是单击该错误消息时总是出现错误,因此无法使用它(这是我无法解决的单独问题)。 Hence, I am unsure if it is just an issue with printing the database or if there is actually any data in the database at all. 因此,我不确定打印数据库是否只是一个问题,或者数据库中实际上是否有任何数据。 Any help would be much appreciated 任何帮助将非常感激

----MainActivity.java---- ---- ---- MainActivity.java

dbHandler = new DatabaseHandler(this, null, null, 1);
printDatabase();

//Print the database
public void printDatabase() {
    String dbString = dbHandler.databaseToString();
    recordsTextView.setText(dbString);
}

//Add an item to the database
public void addButtonClicked(View view){
    Income date = new Income(dateView.getText().toString());
    Income repeat = new Income(repeatSpinner.getSelectedItem().toString());
    Income account = new Income(accountSpinner.getSelectedItem().toString());
    dbHandler.addData(date, repeat, account);
   printDatabase();
}

//Delete items with input date from database
public void deleteButtonClicked(View view){
    String inputText = dateView.getText().toString();
    dbHandler.deleteData(inputText);
    printDatabase();
}

----DatabaseHandler.java---- ---- ---- DatabaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "IncomeExpenseDB.db";
public static final String TABLE_NAME = "income_expense";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_REPEAT = "repeat";
public static final String COLUMN_ACCOUNT = "account";

public DatabaseHandler(Context context, String name, 
SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_NAME + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_DATE + " TEXT, " + COLUMN_REPEAT + " TEXT, " + 
            COLUMN_ACCOUNT + " TEXT " +
            ");";
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

//Add a new row to the database
public void addData(Income date, Income repeat, Income 
account){
    ContentValues values = new ContentValues();
    values.put(COLUMN_DATE, date.get_item());
    values.put(COLUMN_REPEAT, repeat.get_item());
    values.put(COLUMN_ACCOUNT, account.get_item());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_NAME, null, values);
    db.close();
}


//Delete data from the database
public void deleteData(String date){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + COLUMN_DATE + "=\"" 
    + date + "\";");
}

// Create a string to print out in MainActivity
public String databaseToString() {
    String dbString = "";
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE 1";
    //Cursor points to a location in results
    Cursor c = db.rawQuery(query, null);
    //Move to first row in results
    c.moveToFirst();
    while (!c.isAfterLast()) {
        if (c.getString(c.getColumnIndex("date")) != null && 
        c.getString(c.getColumnIndex("repeat")) != null && 
        c.getString(c.getColumnIndex("account")) != null) {
            dbString += c.getString(c.getColumnIndex("date"));
            dbString += " ";
            dbString += c.getString(c.getColumnIndex("repeat"));
            dbString += " ";
            dbString += c.getString(c.getColumnIndex("account"));
            dbString += "\n";
        }
        c.moveToNext();
    }
    db.close();
    return dbString;
}

}

----Income.java---- ---- ---- Income.java

public class Income {
    private int _id;
    private String _item;

    public Income(){
    }
    public Income(String item) {
        this._item = item;
    }
    public int get_id() {
        return _id;
    }
    public void set_id(int _id) {
        this._id = _id;
    }
    public String get_item() {
        return _item;
    }
    public void set_item(String _item) {
        this._item = _item;
    }
}

Uninstalling and reinstalling is very naive approach which will only work in development phase. 卸载和重新安装是非常幼稚的方法,仅在开发阶段有效。 When your app goes on to play store, users are not going to uninstall and reinstall the app. 当您的应用继续运行商店时,用户将不会卸载并重新安装该应用。

Correct way to update the database for published apps is to increase your db version and use onUpgrade method to update your database. 为已发布的应用程序更新数据库的正确方法是增加数据库版本,并使用onUpgrade方法更新数据库。

look at this method 看这个方法

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

In current scenario if you just increase your db version, it will drop existing table and create a new one with new columns and specifications. 在当前情况下,如果仅增加数据库版本,它将删除现有表并使用新列和规范创建一个新表。 The downside is that you'll lose all of your existing data. 缺点是您将丢失所有现有数据。

If you want to save existing data and add new column to db, you have to do something like this - 如果您要保存现有数据并将新列添加到db,则必须执行以下操作-

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
  switch(oldVersion) {
    case 1:
      //add new column
      sqLiteDatabase.execSQL("ALTER TABLE "+ TABLE_NAME + " ADD COLUMN "+ NEW_COLUMN + " INTEGER/TEXT ");
  }
}

Just update your version of database when you add any column or make any update in the table. 添加任何列或在表中进行任何更新时,只需更新数据库版本即可。 ... this helps me hope it will also work for you. ...这有助于我希望它也对您有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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