@blog.justoneplanet.info

日々勉強

AndroidでSQLiteを使ってテーブル構造を変える

class HogeHelper extends SQLiteOpenHelper {
    private Context mContext;
    public HogeHelper(Context context, CursorFactory factory) {
        super(context, CategoryTable.FILENAME, factory, CategoryTable.VERSION);
        mContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE `tbl`(`_id` INTEGER PRIMARY KEY AUTOINCREMENT,`name` TEXT);");
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion == 1 && newVersion == 2) {
            // ordカラムの追加
            db.execSQL("ALTER TABLE `tbl` ADD `ord` INTEGER AFTER `name`;");
            
            // 既存データの取得(idだけ)
            Cursor cursor = db.query(
                    "tbl",
                    new String[]{
                            "_id"
                    },
                    null,
                    null,
                    null,
                    null,
                    "_id ASC"
            );
            
            // 既存データのordカラムのデータを入れる
            int ord = 0;
            if(cursor.moveToFirst()){
                do{
                    db.execSQL(
                        "UPDATE `tbl` SET `ord` = ? WHERE `_id` = ?",
                        new String[]{String.valueOf(ord),
                        String.valueOf(cursor.getLong(cursor.getColumnIndex("_id")))}
                    );
                    ord = ord + 10;
                }
                while(cursor.moveToNext());
            }
            cursor.close();
        }
    }
}

onUpgradeメソッド内で以下のようにデータの取得はできる。

Cursor cursor = db.query(
    "tbl",
    new String[]{"_id"},
    null,
    null,
    null,
    null,
    "_id ASC"
);

onUpgradeメソッド内で以下のようにデータの変更はできない。

db.update(...);

dbはread専用であると怒られる。以下のように書込専用のdbを取得することもできない。

getWritableDatabase();

getWritableDatabaseメソッドがhelperのonUpgradeをcallするためである。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment