From 94b6d06899ddb3f97cd0171bce5de1cb60602d01 Mon Sep 17 00:00:00 2001 From: Tom O'Neill Date: Wed, 9 Dec 2009 15:41:05 -0800 Subject: Extract and check in NotepadCodeLab.zip for change tracking The 3-part Notepad tutorial is currently only available in the zip archive frameworks/base/docs/html/guide/tutorials/notepad/codelab/NotepadCodeLab.zip. This CL adds the uncompressed code to the repository so that there is a paper trail of future changes to the code. --- .../NotepadCodeLab/Notepadv1/AndroidManifest.xml | 11 ++ .../NotepadCodeLab/Notepadv1/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv1/res/layout/notepad_list.xml | 6 + .../Notepadv1/res/values/strings.xml | 5 + .../src/com/android/demo/notepad1/Notepadv1.java | 44 +++++ .../com/android/demo/notepad1/NotesDbAdapter.java | 188 +++++++++++++++++++++ .../Notepadv1Solution/AndroidManifest.xml | 12 ++ .../Notepadv1Solution/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv1Solution/res/layout/notepad_list.xml | 14 ++ .../Notepadv1Solution/res/layout/notes_row.xml | 5 + .../Notepadv1Solution/res/values/strings.xml | 6 + .../src/com/android/demo/notepad1/Notepadv1.java | 78 +++++++++ .../com/android/demo/notepad1/NotesDbAdapter.java | 188 +++++++++++++++++++++ .../NotepadCodeLab/Notepadv2/AndroidManifest.xml | 12 ++ .../NotepadCodeLab/Notepadv2/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv2/res/layout/note_edit.xml | 33 ++++ .../Notepadv2/res/layout/notes_list.xml | 13 ++ .../Notepadv2/res/layout/notes_row.xml | 4 + .../Notepadv2/res/values/strings.xml | 11 ++ .../src/com/android/demo/notepad2/Notepadv2.java | 120 +++++++++++++ .../com/android/demo/notepad2/NotesDbAdapter.java | 188 +++++++++++++++++++++ .../Notepadv2Solution/AndroidManifest.xml | 12 ++ .../Notepadv2Solution/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv2Solution/res/layout/note_edit.xml | 33 ++++ .../Notepadv2Solution/res/layout/notes_list.xml | 13 ++ .../Notepadv2Solution/res/layout/notes_row.xml | 4 + .../Notepadv2Solution/res/values/strings.xml | 11 ++ .../src/com/android/demo/notepad2/NoteEdit.java | 76 +++++++++ .../src/com/android/demo/notepad2/Notepadv2.java | 147 ++++++++++++++++ .../com/android/demo/notepad2/NotesDbAdapter.java | 188 +++++++++++++++++++++ .../NotepadCodeLab/Notepadv3/AndroidManifest.xml | 12 ++ .../NotepadCodeLab/Notepadv3/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv3/res/layout/note_edit.xml | 33 ++++ .../Notepadv3/res/layout/notes_list.xml | 13 ++ .../Notepadv3/res/layout/notes_row.xml | 4 + .../Notepadv3/res/values/strings.xml | 11 ++ .../src/com/android/demo/notepad3/NoteEdit.java | 76 +++++++++ .../src/com/android/demo/notepad3/Notepadv3.java | 148 ++++++++++++++++ .../com/android/demo/notepad3/NotesDbAdapter.java | 188 +++++++++++++++++++++ .../Notepadv3Solution/AndroidManifest.xml | 12 ++ .../Notepadv3Solution/res/drawable/icon.png | Bin 0 -> 6094 bytes .../Notepadv3Solution/res/layout/note_edit.xml | 33 ++++ .../Notepadv3Solution/res/layout/notes_list.xml | 13 ++ .../Notepadv3Solution/res/layout/notes_row.xml | 4 + .../Notepadv3Solution/res/values/strings.xml | 11 ++ .../src/com/android/demo/notepad3/NoteEdit.java | 109 ++++++++++++ .../src/com/android/demo/notepad3/Notepadv3.java | 124 ++++++++++++++ .../com/android/demo/notepad3/NotesDbAdapter.java | 188 +++++++++++++++++++++ 48 files changed, 2401 insertions(+) create mode 100755 tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv1/res/layout/notepad_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java create mode 100755 tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notepad_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/Notepadv1.java create mode 100755 tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java create mode 100755 tutorials/NotepadCodeLab/Notepadv2/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv2/res/layout/note_edit.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2/res/layout/notes_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2/res/layout/notes_row.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java create mode 100755 tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/res/layout/note_edit.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/res/layout/notes_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/res/layout/notes_row.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NoteEdit.java create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/Notepadv2.java create mode 100755 tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NotesDbAdapter.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv3/res/layout/note_edit.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_row.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/AndroidManifest.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/res/drawable/icon.png create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/res/layout/note_edit.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/res/layout/notes_list.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/res/layout/notes_row.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/res/values/strings.xml create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NoteEdit.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/Notepadv3.java create mode 100755 tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NotesDbAdapter.java (limited to 'tutorials/NotepadCodeLab') diff --git a/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml new file mode 100755 index 000000000..33f30da3c --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv1/res/drawable/icon.png b/tutorials/NotepadCodeLab/Notepadv1/res/drawable/icon.png new file mode 100755 index 000000000..64e3601c2 Binary files /dev/null and b/tutorials/NotepadCodeLab/Notepadv1/res/drawable/icon.png differ diff --git a/tutorials/NotepadCodeLab/Notepadv1/res/layout/notepad_list.xml b/tutorials/NotepadCodeLab/Notepadv1/res/layout/notepad_list.xml new file mode 100755 index 000000000..154888dd3 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1/res/layout/notepad_list.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv1/res/values/strings.xml b/tutorials/NotepadCodeLab/Notepadv1/res/values/strings.xml new file mode 100755 index 000000000..5698961a6 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Notepad v1 + No Notes Yet + diff --git a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java new file mode 100755 index 000000000..43e7a7733 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +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; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // TODO Auto-generated method stub + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // TODO Auto-generated method stub + return super.onOptionsItemSelected(item); + } +} diff --git a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java new file mode 100755 index 000000000..6f85bbd20 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +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; + +/** + * Simple notes database access helper class. Defines the basic CRUD operations + * for the notepad example, and gives the ability to list all notes as well as + * retrieve or modify a specific note. + * + * This has been improved from the first version of this tutorial through the + * addition of better error handling and also using returning a Cursor instead + * of using a collection of inner classes (which is less scalable and not + * recommended). + */ +public class NotesDbAdapter { + + public static final String KEY_TITLE = "title"; + public static final String KEY_BODY = "body"; + public static final String KEY_ROWID = "_id"; + + private static final String TAG = "NotesDbAdapter"; + private DatabaseHelper mDbHelper; + private SQLiteDatabase mDb; + + /** + * Database creation sql statement + */ + private static final String DATABASE_CREATE = + "create table notes (_id integer primary key autoincrement, " + + "title text not null, body text not null);"; + + private static final String DATABASE_NAME = "data"; + private static final String DATABASE_TABLE = "notes"; + private static final int DATABASE_VERSION = 2; + + 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) { + 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); + } + } + + /** + * Constructor - takes the context to allow the database to be + * opened/created + * + * @param ctx the Context within which to work + */ + public NotesDbAdapter(Context ctx) { + this.mCtx = ctx; + } + + /** + * Open the notes database. If it cannot be opened, try to create a new + * instance of the database. If it cannot be created, throw an exception to + * signal the failure + * + * @return this (self reference, allowing this to be chained in an + * initialization call) + * @throws SQLException if the database could be neither opened or created + */ + public NotesDbAdapter open() throws SQLException { + mDbHelper = new DatabaseHelper(mCtx); + mDb = mDbHelper.getWritableDatabase(); + return this; + } + + public void close() { + mDbHelper.close(); + } + + + /** + * Create a new note using the title and body provided. If the note is + * successfully created return the new rowId for that note, otherwise return + * a -1 to indicate failure. + * + * @param title the title of the note + * @param body the body of the note + * @return rowId or -1 if failed + */ + public long createNote(String title, String body) { + ContentValues initialValues = new ContentValues(); + initialValues.put(KEY_TITLE, title); + initialValues.put(KEY_BODY, body); + + return mDb.insert(DATABASE_TABLE, null, initialValues); + } + + /** + * Delete the note with the given rowId + * + * @param rowId id of note to delete + * @return true if deleted, false otherwise + */ + public boolean deleteNote(long rowId) { + + return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; + } + + /** + * Return a Cursor over the list of all notes in the database + * + * @return Cursor over all notes + */ + public Cursor fetchAllNotes() { + + return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, + KEY_BODY}, null, null, null, null, null); + } + + /** + * Return a Cursor positioned at the note that matches the given rowId + * + * @param rowId id of note to retrieve + * @return Cursor positioned to matching note, if found + * @throws SQLException if note could not be found/retrieved + */ + public Cursor fetchNote(long rowId) throws SQLException { + + 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; + + } + + /** + * Update the note using the details provided. The note to be updated is + * specified using the rowId, and it is altered to use the title and body + * values passed in + * + * @param rowId id of note to update + * @param title value to set note title to + * @param body value to set note body to + * @return true if the note was successfully updated, false otherwise + */ + 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; + } +} diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv1Solution/AndroidManifest.xml new file mode 100755 index 000000000..99023fe78 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/res/drawable/icon.png b/tutorials/NotepadCodeLab/Notepadv1Solution/res/drawable/icon.png new file mode 100755 index 000000000..64e3601c2 Binary files /dev/null and b/tutorials/NotepadCodeLab/Notepadv1Solution/res/drawable/icon.png differ diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notepad_list.xml b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notepad_list.xml new file mode 100755 index 000000000..0c8dbabee --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notepad_list.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml new file mode 100755 index 000000000..6b1a65b05 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/res/values/strings.xml b/tutorials/NotepadCodeLab/Notepadv1Solution/res/values/strings.xml new file mode 100755 index 000000000..265bc62e3 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/res/values/strings.xml @@ -0,0 +1,6 @@ + + + Notepad v1 + No Notes Yet + Add Item + diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/Notepadv1.java b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/Notepadv1.java new file mode 100755 index 000000000..a1819ed0f --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/Notepadv1.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.demo.notepad1; + +import android.app.ListActivity; +import android.database.Cursor; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.SimpleCursorAdapter; + +public class Notepadv1 extends ListActivity { + public static final int INSERT_ID = Menu.FIRST; + + private int mNoteNumber = 1; + private NotesDbAdapter mDbHelper; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.notepad_list); + mDbHelper = new NotesDbAdapter(this); + mDbHelper.open(); + fillData(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + boolean result = super.onCreateOptionsMenu(menu); + menu.add(0, INSERT_ID, 0, R.string.menu_insert); + return result; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case INSERT_ID: + createNote(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void createNote() { + String noteName = "Note " + mNoteNumber++; + mDbHelper.createNote(noteName, ""); + fillData(); + } + + private void fillData() { + // Get all of the notes from the database and create the item list + Cursor c = mDbHelper.fetchAllNotes(); + startManagingCursor(c); + + String[] from = new String[] { NotesDbAdapter.KEY_TITLE }; + int[] to = new int[] { R.id.text1 }; + + // Now create an array adapter and set it to display using our row + SimpleCursorAdapter notes = + new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); + setListAdapter(notes); + } +} diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java new file mode 100755 index 000000000..6f85bbd20 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +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; + +/** + * Simple notes database access helper class. Defines the basic CRUD operations + * for the notepad example, and gives the ability to list all notes as well as + * retrieve or modify a specific note. + * + * This has been improved from the first version of this tutorial through the + * addition of better error handling and also using returning a Cursor instead + * of using a collection of inner classes (which is less scalable and not + * recommended). + */ +public class NotesDbAdapter { + + public static final String KEY_TITLE = "title"; + public static final String KEY_BODY = "body"; + public static final String KEY_ROWID = "_id"; + + private static final String TAG = "NotesDbAdapter"; + private DatabaseHelper mDbHelper; + private SQLiteDatabase mDb; + + /** + * Database creation sql statement + */ + private static final String DATABASE_CREATE = + "create table notes (_id integer primary key autoincrement, " + + "title text not null, body text not null);"; + + private static final String DATABASE_NAME = "data"; + private static final String DATABASE_TABLE = "notes"; + private static final int DATABASE_VERSION = 2; + + 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) { + 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); + } + } + + /** + * Constructor - takes the context to allow the database to be + * opened/created + * + * @param ctx the Context within which to work + */ + public NotesDbAdapter(Context ctx) { + this.mCtx = ctx; + } + + /** + * Open the notes database. If it cannot be opened, try to create a new + * instance of the database. If it cannot be created, throw an exception to + * signal the failure + * + * @return this (self reference, allowing this to be chained in an + * initialization call) + * @throws SQLException if the database could be neither opened or created + */ + public NotesDbAdapter open() throws SQLException { + mDbHelper = new DatabaseHelper(mCtx); + mDb = mDbHelper.getWritableDatabase(); + return this; + } + + public void close() { + mDbHelper.close(); + } + + + /** + * Create a new note using the title and body provided. If the note is + * successfully created return the new rowId for that note, otherwise return + * a -1 to indicate failure. + * + * @param title the title of the note + * @param body the body of the note + * @return rowId or -1 if failed + */ + public long createNote(String title, String body) { + ContentValues initialValues = new ContentValues(); + initialValues.put(KEY_TITLE, title); + initialValues.put(KEY_BODY, body); + + return mDb.insert(DATABASE_TABLE, null, initialValues); + } + + /** + * Delete the note with the given rowId + * + * @param rowId id of note to delete + * @return true if deleted, false otherwise + */ + public boolean deleteNote(long rowId) { + + return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; + } + + /** + * Return a Cursor over the list of all notes in the database + * + * @return Cursor over all notes + */ + public Cursor fetchAllNotes() { + + return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, + KEY_BODY}, null, null, null, null, null); + } + + /** + * Return a Cursor positioned at the note that matches the given rowId + * + * @param rowId id of note to retrieve + * @return Cursor positioned to matching note, if found + * @throws SQLException if note could not be found/retrieved + */ + public Cursor fetchNote(long rowId) throws SQLException { + + 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; + + } + + /** + * Update the note using the details provided. The note to be updated is + * specified using the rowId, and it is altered to use the title and body + * values passed in + * + * @param rowId id of note to update + * @param title value to set note title to + * @param body value to set note body to + * @return true if the note was successfully updated, false otherwise + */ + 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; + } +} diff --git a/tutorials/NotepadCodeLab/Notepadv2/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv2/AndroidManifest.xml new file mode 100755 index 000000000..738fb2afc --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv2/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/NotepadCodeLab/Notepadv2/res/drawable/icon.png b/tutorials/NotepadCodeLab/Notepadv2/res/drawable/icon.png new file mode 100755 index 000000000..64e3601c2 Binary files /dev/null and b/tutorials/NotepadCodeLab/Notepadv2/res/drawable/icon.png differ diff --git a/tutorials/NotepadCodeLab/Notepadv2/res/layout/note_edit.xml b/tutorials/NotepadCodeLab/Notepadv2/res/layout/note_edit.xml new file mode 100755 index 000000000..b254552c3 --- /dev/null +++ b/tutorials/NotepadCodeLab/Notepadv2/res/layout/note_edit.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + +