8.2 Android Basic 数据存储 Database SQLite Demo 2

<<SQLiteDemo2.zip>>

SQLite Demo 2

本演练演示一个日记本程序

   

  • 新建项目SQLiteDemo2, 编辑res/layout/main.xml 文件

       

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk

    /res/android"

    android:layout_width="wrap_content" android:layout_height="wrap_content">

    <ListView android:id="@+id/android:list" android:layout_width="wrap_content"

    android:layout_height="wrap_content" />

    <TextView android:id="@+id/android:empty"

    android:layout_width="wrap_content" android:layout_height="wrap_content"

    android:text="没有日记内容点击菜单开始写日记" />

    </LinearLayout>

       

    2. 在res/layout/ 新建布局文件 diary_row.xml 用于显示日记的界面:

    <?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout android:id="@+id/row"

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

       

    <TextView android:id="@+id/text1"

    android:layout_width="wrap_content" android:layout_height="30px"

    android:maxWidth="200dip"

    android:textSize="22sp"

    android:layout_marginTop="10dip"

    android:text="标题" />

    <TextView android:id="@+id/created" android:layout_width="wrap_content"

    android:layout_height="35px" android:layout_alignParentRight="true"

    android:layout_marginLeft="10dip"

    android:layout_marginTop="10dip"

    android:text="xxxxxxxx" />

    </RelativeLayout>

       

    3. 在res/layout/新建布局文件 diary_edit.xml 用于编辑日记的界面

    <?xml version="1.0" encoding="utf-8"?>

       

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

       

    <LinearLayout android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content">

       

    <TextView android:layout_width="wrap_content"

    android:layout_height="wrap_content" android:text="@string/title"

    android:padding="2px" />

    <EditText android:id="@+id/title"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content" android:layout_weight="1" />

    </LinearLayout>

       

    <TextView android:layout_width="wrap_content"

    android:layout_height="wrap_content" android:text="@string/body" />

    <EditText android:id="@+id/body" android:layout_width="fill_parent"

    android:layout_height="fill_parent" android:layout_weight="1"

    android:scrollbars="vertical" android:gravity="top" />

       

    <Button android:id="@+id/confirm" android:text="@string/confirm"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content" />

       

    </LinearLayout>

       

    4. 打开res/values/string.xml,添加如下内容:

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <string name="hello">Hello World, SQLiteDemo2!</string>

    <string name="app_name">SQLiteDemo2</string>

    <string name="menu_insert">添加一篇新日记</string>

    <string name="menu_delete">删除一篇日记</string>

    <string name="title">标题</string>

    <string name="body">内容</string>

    <string name="confirm">确定</string>

    <string name="edit_diary">编辑日记</string>

    </resources>

       

    5. 新建DiaryDbAdapter类,用于封装对数据库的操作。

    import java.util.Calendar;

    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;

       

    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 = "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);

    }

       

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

    mDbHelper = new DatabaseHelper(mCtx);

    mDb = mDbHelper.getWritableDatabase();

    return this;

    }

       

    public void closeclose() {

    mDbHelper.close();

    }

       

    public long createDiary(String title, String body) {

    ContentValues initialValues = new ContentValues();

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

       

    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;

    }

    }

       

       

    6. 新建类DiaryEditActivity类继承自Activity类用于编辑日记:

    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 DiaryEditActivity 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) {

    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);

    finish();

    }

       

    });

    }

    }

       

       

    7. 编辑SQLiteDemo2类

       

    import android.app.Activity;

    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 SQLiteDemo2 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.main);

    mDbHelper = new DiaryDbAdapter(this);

    mDbHelper.open();

    renderListView();

       

    }

       

    private void renderListView() {

    mDiaryCursor = mDbHelper.getAllNotes();

    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);

    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;

    }

       

    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, DiaryEditActivity.class);

    startActivityForResult(i, ACTIVITY_CREATE);

    }

       

    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, DiaryEditActivity.class);

    i.putExtra(DiaryDbAdapter.KEY_ROWID, id);

    i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString(c

    .getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));

    i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString(c

    .getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));

    startActivityForResult(i, ACTIVITY_EDIT);

    }

       

    @Override

    protected void onActivityResult(int requestCode, int resultCode,

    Intent intent) {

    super.onActivityResult(requestCode, resultCode, intent);

    renderListView();

    }

    }

       

    8. 在AndroidManifest.xml 中配置

    <activity android:name="DiaryEditActivity"></activity>

       

       

posted @ 2011-03-25 17:27  敏捷学院  阅读(400)  评论(0编辑  收藏  举报