SQLite學習實例, 日記本

這是一個簡單的android日記程序, 按下菜單欄後, 會出現添加新日記和刪除日記兩項, 點擊主頁面的日記可以直接編輯日記

整個程序分成三個文件, 主程序邏輯是ActivityMain.java, 編輯邏輯是ActivityDiaryEdit.java, 還有一個DiaryDbAdapter.java文件定義了一個DiaryDbAdapter類,封裝數據庫的操作.

以下是ActivityMain.java文件的code:

/**
*ActivityMain.java
*/

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class ActivityMain extends ListActivity {
	private static final int ACTIVITY_CREATE = 0;
	private static final int ACTIVITY_EDIT = 1;

	private static final int INSERT_ID = Menu.FIRST;
	private static final int DELETE_ID = Menu.FIRST + 1;

	private DiaryDbAdapter mDbHelper;  //操作數據庫的實例
	private Cursor mDiaryCursor;       //存儲日記

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.diary_list);
		mDbHelper = new DiaryDbAdapter(this);     //創建自定義類DiaryDbAdapter的實例
		mDbHelper.open();                        //打開數據庫
		renderListView();                       //刷新顯示主界面

	}

	private void renderListView() {
                mDiaryCursor = mDbHelper.getAllNotes();   //獲得所有日誌文件, 並賦給Cursor實例
		startManagingCursor(mDiaryCursor);
		String[] from = new String[] { DiaryDbAdapter.KEY_TITLE,
				DiaryDbAdapter.KEY_CREATED };
		int[] to = new int[] { R.id.text1, R.id.created };
		SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
				R.layout.diary_row, mDiaryCursor, from, to);   //把遊標數據顯示在視圖上的指定位置
                                                                              //R.layout.diary_row爲每一行的佈局
                                setListAdapter(notes);                   //顯示界面
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {              
		super.onCreateOptionsMenu(menu);
		menu.add(0, INSERT_ID, 0, R.string.menu_insert);      //加入菜單項, 添加日記
                menu.add(0, DELETE_ID, 0, R.string.menu_delete);      //加入菜單項, 刪除日記
		return true;
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		switch (item.getItemId()) {
		case INSERT_ID:
			createDiary();     //點擊添加日記時的動作
			return true;
		case DELETE_ID:
			mDbHelper.deleteDiary(getListView().getSelectedItemId());  //點擊刪除日記時的動作
			renderListView();
			return true;
		}
		return super.onMenuItemSelected(featureId, item);
	}

	private void createDiary() {
		Intent i = new Intent(this, ActivityDiaryEdit.class);       
		startActivityForResult(i, ACTIVITY_CREATE);           //跳轉到編輯界面
	}

	@Override
	/* 需要對position和id進行一個區分
	 * position指的是點擊的這個ViewItem在當前ListView中的位置
	 * 每一個和ViewItem綁定的數據,肯定都有一個id,通過這個資源id可以找到那條數據。
         */
        protected void onListItemClick(ListView l, View v, int position, long id) {
        //點擊日記時打開編輯界面,直接編輯日記
		super.onListItemClick(l, v, position, id);
		Cursor c = mDiaryCursor;
		c.moveToPosition(position);      //遊標移動到你點擊的位置, 即獲得日記的數據
		Intent i = new Intent(this, ActivityDiaryEdit.class);
		i.putExtra(DiaryDbAdapter.KEY_ROWID, id);          //把id值存入intent
		i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString(c
				.getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));   //把title的值存入intent
		i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString(c
				.getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));    //把body的值存入intent
		startActivityForResult(i, ACTIVITY_EDIT);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		super.onActivityResult(requestCode, resultCode, intent);
		renderListView();        //編輯完成返回後, 刷新顯示主界面
	}
}


以下是ActivityDiaryEdit.java的code:

/**
*ActivityDiaryEdit.java
*/

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ActivityDiaryEdit extends Activity {

	private EditText mTitleText;
	private EditText mBodyText;
	private Long mRowId;
	private DiaryDbAdapter mDbHelper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mDbHelper = new DiaryDbAdapter(this);
		mDbHelper.open();
		setContentView(R.layout.diary_edit);

		mTitleText = (EditText) findViewById(R.id.title);
		mBodyText = (EditText) findViewById(R.id.body);

		Button confirmButton = (Button) findViewById(R.id.confirm);

		mRowId = null;
		// 每一個intent都會帶一個Bundle型的extras數據。
		Bundle extras = getIntent().getExtras();
		if (extras != null) {      //如果extras爲空,則是創建日記; 如果非空,則是編輯日記
			String title = extras.getString(DiaryDbAdapter.KEY_TITLE);
			String body = extras.getString(DiaryDbAdapter.KEY_BODY);
			mRowId = extras.getLong(DiaryDbAdapter.KEY_ROWID);

			if (title != null) {
				mTitleText.setText(title);   //顯示需要編輯的日記題目
			}
			if (body != null) {
				mBodyText.setText(body);     //顯示需要編輯的日記內容
			}
		}

		confirmButton.setOnClickListener(new View.OnClickListener() {  //保存按鈕
			public void onClick(View view) {
				String title = mTitleText.getText().toString();
				String body = mBodyText.getText().toString();
				if (mRowId != null) {   //如果爲空,則是創建日記; 如果非空,則是更新日記
					mDbHelper.updateDiary(mRowId, title, body);   //操作數據庫, 更新日記內容
				} else
					mDbHelper.createDiary(title, body);     //操作數據庫, 創建日記
				Intent mIntent = new Intent();
				setResult(RESULT_OK, mIntent);     //設置返回RESULE_OK
				finish();
			}

		});
	}
}


以下是DiaryDbAdapter.java的code:

/**
*DiaryDbAdapter.java
*/

import java.util.Calendar;
import java.util.Date;

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 DiaryDbAdapter {

	public static final String KEY_TITLE = "title";
	public static final String KEY_BODY = "body";
	public static final String KEY_ROWID = "_id";
	public static final String KEY_CREATED = "created";

	private static final String TAG = "DiaryDbAdapter";
	private DatabaseHelper mDbHelper;       //負責創建,打開,升級,關閉數據庫
	private SQLiteDatabase mDb;             //負責增,刪,改,查等數據庫的基本操作

	private static final String DATABASE_CREATE_TABLE = "create table diary (_id integer primary key autoincrement, "
			+ "title text not null, body text not null, created text not null);";

	private static final String DATABASE_NAME = "database";
	private static final String DATABASE_TABLE = "diary";
	private static final int DATABASE_VERSION = 1;

	private final Context mCtx;

	private static class DatabaseHelper extends SQLiteOpenHelper {

		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE_TABLE);     //創建數據表
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS diary");    //通過直接刪除舊數據庫,重建新數據庫,實現數據庫升級
			onCreate(db);
		}
	}

	public DiaryDbAdapter(Context ctx) {
		this.mCtx = ctx;
	}

	public DiaryDbAdapter open() throws SQLException {    //打開數據庫, 獲得SQLiteDatabase實例
		mDbHelper = new DatabaseHelper(mCtx);
		mDb = mDbHelper.getWritableDatabase();
		return this;
	}

	public void close() {
		mDbHelper.close();  //關閉數據庫
	}

	public long createDiary(String title, String body) {
		ContentValues initialValues = new ContentValues();   //ContentValues與map類似, 只能存儲基本類型的值
		initialValues.put(KEY_TITLE, title);
		initialValues.put(KEY_BODY, body);
		Calendar calendar = Calendar.getInstance();
		String created = calendar.get(Calendar.YEAR) + "年"
				+ calendar.get(Calendar.MONTH) + "月"
				+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
				+ calendar.get(Calendar.HOUR_OF_DAY) + "時"
				+ calendar.get(Calendar.MINUTE) + "分";   
		initialValues.put(KEY_CREATED, created);             //存儲創建日記的時間
		return mDb.insert(DATABASE_TABLE, null, initialValues);
	}

	public boolean deleteDiary(long rowId) {    //刪除指定ID的日記

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

	public Cursor getAllNotes() {

		return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE,
				KEY_BODY, KEY_CREATED }, null, null, null, null, null);
	}

	public Cursor getDiary(long rowId) throws SQLException {

		Cursor mCursor =

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

	}

	public boolean updateDiary(long rowId, String title, String body) {
		ContentValues args = new ContentValues();
		args.put(KEY_TITLE, title);
		args.put(KEY_BODY, body);
		Calendar calendar = Calendar.getInstance();
		String created = calendar.get(Calendar.YEAR) + "年"
				+ calendar.get(Calendar.MONTH) + "月"
				+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
				+ calendar.get(Calendar.HOUR_OF_DAY) + "時"
				+ calendar.get(Calendar.MINUTE) + "分";
		args.put(KEY_CREATED, created);

		return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;  //更新指定ID的日記
	}
}


最後來一張實現圖, 上角菜單項,白色部分每個日記的標題.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章