読者です 読者をやめる 読者になる 読者になる

【Android】データベースのバージョンアップ

Android

 

アダプタクラスに実装します。

DBのカラムを追加するためにバージョンアップしています。

 

public class DBAdapter {

  static final String DB_NAME = "my.db";
  static final int DB_VERSION = 2;
  public static final String TABLE_NAME = "mynote";
  public static final String COL_ID = "_id";
  public static final String COL_TITLE = "title";
  public static final String COL_URL = "url";
  public static final String COL_SYSDATE = "sysdate";

  protected final Context context;
  protected DBHelper dbHelper;
  protected SQLiteDatabase db;

  public DBAdapter(Context context) {

    this.context = context;
    dbHelper = new DBHelper(this.context);
  }
  private static class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
      super(context, DB_NAME, null, DB_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {

    //データベースを作成したタイミングで呼び出される
    //通常はここでテーブルを作成

      db.execSQL(
       "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
         COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
         COL_TITLE + " TEXT NOT NULL," +
         COL_URL + " TEXT NOT NULL," +
         COL_SYSDATE + " TEXT NOT NULL);");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
      // //これだけでは古いテーブルに入っていたデータが全て消えてしまう
      // db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); //削除
      // onCreate(db); //作成
      // //-------------------------------------------------------

      //既に古いバージョン(1)のデーターベースが存在していると
      //だけonUpgradeを実行

      if (oldVer == 1 && newVer == 2) {

        //SYSDATEカラムの追加

        String ALTER_TABLE = "ALTER TABLE "
         + TABLE_NAME + " ADD " + COL_SYSDATE + " TEXT AFTER " +           COL_SCREENSHOT + ";";
        db.execSQL(ALTER_TABLE);

        //追加項目のカラムの値となるシステム日時
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date(System.currentTimeMillis());

        //既存データ取得(idだけ)
        Cursor cur = db.query(false, TABLE_NAME, null, null, null, null,

                  null, null, null, null);

        //既存データに追加項目のSYSDATEカラムにデータを入れる
        if (cur.moveToFirst()) {
          do {
            long id = cur.getLong(cur.getColumnIndex(COL_ID));
            db.execSQL(
               "UPDATE " + TABLE_NAME + " SET " +

               COL_SYSDATE + " = ? WHERE _id = ?",
               new String{
                 String.valueOf(df.format(date)),
                 String.valueOf(id)
               }
            );
          } while (cur.moveToNext());
        }
        cur.close();
      }
    }
  }
  public DBAdapter open() {
    db = dbHelper.getWritableDatabase();
    return this;
  }
  public void close() {
    dbHelper.close();
  }
  public boolean deleteTables() {
    return db.delete(TABLE_NAME, null, null) > 0;
  }
  public boolean deleteTable(String url) {
    String selection = COL_URL + "=?";
    String
selections = {url};
    return db.delete(TABLE_NAME, selection, selections) > 0;
  }
  public Cursor getTables() {
    String orderBy = COL_SYSDATE + " DESC";
    return db.query(false, TABLE_NAME, null, null, null, null, null, orderBy,

            null, null);
  }
  public Cursor getTable(String url) {
    String selection = COL_URL + "=?";
    String selections = {url};
    return db.query(false, TABLE_NAME, null, selection, selections, null, null,

           null, null, null);
  }
  public void insert(String title, String url, byte screenshot) {

    ContentValues values = new ContentValues();
    values.put(COL_TITLE, title);
    values.put(COL_URL, url);
    values.put(COL_SYSDATE, this.getSysdate());
    // 第1 distinct 第2 table 第3 columns 第4 selection 第5 selectionArgs
    // 第6 groupBy 第7 having 第8 orderBy 第9 limit 第10 cancellationSignal
    String selection = COL_URL + "=?";
    String[] selections = {url};
    Cursor c = db.query(false, TABLE_NAME, null, selection, selections, null,

             null, null, null, null);
    boolean EOF = c.moveToFirst();
    db.beginTransaction();
    try{
      if (EOF) {
        db.update(TABLE_NAME, values, selection, selections);
      } else {
        db.insertOrThrow(TABLE_NAME, null, values);
      }
      db.setTransactionSuccessful();
    }finally{
      db.endTransaction();
    }
  }
  private String getSysdate() {
    DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date(System.currentTimeMillis());
    return df.format(date);
  }
}