Notepad Tutorialで学ぶAndroidアプリのSQLite講座1

この講座で多分出来るようになること。

少し複雑なAndroidアプリの一通りの作り方。
データの保存・読込、その他いろいろ。

対象:複数のandroid本を読んで知ったかぶっている人、
何となく知ってても実際のandroidアプリを作ったことがない人。

ちなみに上記の対象には私も含まれます・・。






本家:Notepad Tutorial(英語)

実際に私が上記のチュートリアルをやりながら解説していきます!


Step1: Notepad Exercise 1の勉強事項+準備編


Notepad Exercise 1

勉強事項
・ListActivityとMenu optionsの基本的な使い方
・SQLiteの保存の仕方
・cursorの使い方
・レイアウトいろいろ

project exercises archive (.zip)をダウンロードして解凍。

Android Developer Toolsを開いて、
(参考:AndroidをMacにインストールして実行するAndroidをWindowsにインストールして実行する)

New -> project -> Android Project from Existing Code -> Nextボタンをクリック

先ほど解凍したフォルダの中に、Notepadv1というのがあるのでそれをBrowserに指定してFinishボタンをクリック


Step2: ソースコードを眺めよう!


この時点でNotepadv1.javaとNotesDbAdapter.javaがソースコードの中に入っています。

レイアウトとマニフェストには特筆する点なし。
アプリの起動とともにNotepadv1のアクティビティが呼び出されるようになっています。


Notepadv1.java

レイアウトに何もない感じなので、
現時点ではNotepadv1も特に何もない感じなのでコメント解説抜きで、ソースコードだけ。

package com.android.demo.notepad1;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class Notepadv1 extends Activity {
    private int mNoteNumber = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }
}


NotesDbAdapter.java

NotesDbAdapterクラスが、データベースへアクセスして
ノートを作ったり削除したり、ノートのリストを取ってきたり、いろいろ行います。

package com.android.demo.notepad1;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class NotesDbAdapter {

    // まずは最初にいくつか必要なコンスタントを作っておこう
    // まずデータベース(db)のフィールド名のコンスタントを作るー
    public static final String KEY_TITLE = "title";
    public static final String KEY_BODY = "body";
    public static final String KEY_ROWID = "_id";

    // TAGは特に気にせずに!
    private static final String TAG = "NotesDbAdapter";

    // mDbHelperはdbを開いたり閉じたりするのを手伝ってくれるよ
    private DatabaseHelper mDbHelper;

    // dbオブジェクトですー
    private SQLiteDatabase mDb;

    // dbのテーブル作成用するための命令文を用意しておく
    private static final String DATABASE_CREATE =
        "create table notes (_id integer primary key autoincrement, "
        + "title text not null, body text not null);";

    // db名をdata、テーブル名をnotesにするよ
    private static final String DATABASE_NAME = "data";
    private static final String DATABASE_TABLE = "notes";
    private static final int DATABASE_VERSION = 2;

    // contextというやつが、dbを作ったり開いたりするのを許可するよ
    private final Context mCtx;

    // SQLiteOpenHelperはデータベースを開くのを助けてくれるよ
    // こいつを継承した、DatabaseHelperクラスを作ろう
    private static class DatabaseHelper extends SQLiteOpenHelper {

        // コンストラクタ。
        // 指定したdbがない場合、新しくdbを作ってくれる
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // dbのテーブルを作るよ
            db.execSQL(DATABASE_CREATE);
        }

        // dbのバージョンをアップした場合、前のdbを削除して新しいdbを作るよ
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }

    // contextというやつが、dbを作ったり開いたりするのを許可するよ
    // コンストラクトするときにcontextをもらって、activityに渡しておこう
    public NotesDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    // dbを開こう!
    // DatabaseHelperのインスタンスを作る、そして
    // getWritableDatabaseを呼んでSQLiteDatabaseをもらおう
    public NotesDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    // dbを閉じる、それだけ!
    public void close() {
        mDbHelper.close();
    }

    // 新しいノートを作ります!
    public long createNote(String title, String body) {
        // ContentValuesはdbに1つデータを入れる1セットみたいな感じ
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_BODY, body);

        // テーブルに上記で作ったデータを挿入!
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    // 特定の列のノートを削除、それだけ
    public boolean deleteNote(long rowId) {

        return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    // ノートのリストを呼び出せるメソッドだよ
    // データそのものじゃなくて、場所を示すみたいなCursorをくれるよ
    public Cursor fetchAllNotes() {
        // 最初の引数は欲しいリストのテーブル名
        // 次の引数は欲しいカラムデータ
        // それ以降は、いろいろな条件、ここでは全リストなので全部null
        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
                KEY_BODY}, null, null, null, null, null);
    }

    // 前のメソッドと似たようなやつだよ
    // 前のはリストだけど、これは1つだけノートの場所を取ってくるよ
    public Cursor fetchNote(long rowId) throws SQLException {
        // 最初の引数にtrueと指定すると、データを1つだけ取ってくるよ
        Cursor mCursor =

            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
                    null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;

    }

    // ノートを更新するよ、それだけ
    public boolean updateNote(long rowId, String title, String body) {
        ContentValues args = new ContentValues();
        args.put(KEY_TITLE, title);
        args.put(KEY_BODY, body);

        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }
}


NotesDbAdapterクラスを眺めて、
わかった感じになったら、それでOK。

今回の講座1はこれにて終了です。

コメントを残す

メールアドレスが公開されることはありません。