Notepad v3

From LUG Manipal Wiki

Jump to: navigation, search

NotesDbAdapter.java


/*

* 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.notepad3;

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;
   // SQLiteDatabase exposes methods to execute SQLite queries.
   
   /**
    * 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);";
   // DATABASE_CREATE is an SQLite query used to create a table called 'notes'
   // with id, title, and body as its fields.
   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);
       }
       // The onCreate method is used to create the database for the
       // first time, where initial population of the tables happen
       @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;
   }
   //Context is a package found under android.content 
   //It has implementations to access application specific resources
   //such as launching activities and broadcasting messages.
   /**
    * 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);
       // The DatabaseHelper class is a sub class of SQLiteOpenHelper class
       // which takes care of opening or creating the database.
       // mCtx is an object of the Context. It acts as a parameter to the 
       // DatabaseHelper method.
       mDb = mDbHelper.getWritableDatabase();
       // getWriteableDatabase is a member function of SQLiteOpenHelper
       // class which creates/opens a database used for reading/writing.
       // mDb is a SQLiteDatabase object.
       return this;
   }
   
   public void close() {
       mDbHelper.close();
   }
   // the close method closes any open databases.


   /**
    * 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();
       // The ContentValues class is class from android.content.ContentValues
       // which is used to store values.
       // The contentValues() method is used create a set of values
       // with default initialisation.
       initialValues.put(KEY_TITLE, title);
       initialValues.put(KEY_BODY, body);
       
       //The put() method is used to add values through the object.
       return mDb.insert(DATABASE_TABLE, null, initialValues);
       // mDb invokes the the method insert() from the SQLiteDatabase class
       // which lets us insert values into the DATABASE_TABLE = "notes" which is
       // created at the same time.
   }
   /**
    * 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;
   }
   // mDb invokes the delete() method of the SQLiteDatabase class which 
   // takes appropriate parameters to delete a particular row.
   // *warning* passing null as the second parameter will delete 
   // all the rows.
   /**
    * 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);
   }
   // The method query() returns a Cursor object. The Cursor object provides
   // read/write access to the information provided by the SQLite query.
   
   
   /**
    * 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;
       // The update() method is invoked which updates the database. 
       // The third parameter takes the row Id which needs to be updated
       // It returns the 'number' of rows updated.
   }

}


Notepadv3.java

/*

* Copyright (C) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")savedInstanceState;
* 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.notepad3;

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 Notepadv3 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 NotesDbAdapter mDbHelper;
   
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // super keyword is used to invoke the base class constructor
       setContentView(R.layout.notes_list);
       // setContentView() method is used set the content from the layout
       // resource which in this case is /res/layout/notes_list.xml
       
       mDbHelper = new NotesDbAdapter(this);
       mDbHelper.open();
       // open() method is invoked declared in the NotesDbAdapter class.
       
       fillData();
   }
   
   private void fillData() {
       Cursor notesCursor = mDbHelper.fetchAllNotes();
       startManagingCursor(notesCursor);
       
       // Create an array to specify the fields we want to display in the list (only TITLE)
       String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
       
       // and an array of the fields we want to bind those fields to (in this case just text1)
       int[] to = new int[]{R.id.text1};
       
       // Now create a simple cursor adapter and set it to display
       SimpleCursorAdapter notes = 
       	    new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to);
       // Creates an object of the SimpleCursorAdapter with parametrised 
       // constructors.
       
       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;
   }
   // onCreateOptionsMenu is a class which takes in a parameter of type
   // Menu from the package android.view.Menu, which acts as an interface 
   // for managing menus.
   // the add() method defined in the class Menu uses the values declared 
   // in the xml file strings.xml
   @Override
   public boolean onMenuItemSelected(int featureId, MenuItem item) {
       switch(item.getItemId()) {
       case INSERT_ID:
           createNote();
           return true;
       case DELETE_ID:
           mDbHelper.deleteNote(getListView().getSelectedItemId());
           fillData();
           return true;
       }
       // Depending on the Menu selected, item is either created using the 
       // method createnote() or deleted by calling the method deleteNote()
       // declared in NotesDbAdapter.java
      
       return super.onMenuItemSelected(featureId, item);
   }
   private void createNote() {
       Intent i = new Intent(this, NoteEdit.class);
       startActivityForResult(i, ACTIVITY_CREATE);
   }
   
   @Override
   protected void onListItemClick(ListView l, View v, int position, long id) {
       super.onListItemClick(l, v, position, id);
       Intent i = new Intent(this, NoteEdit.class);
       i.putExtra(NotesDbAdapter.KEY_ROWID, id);
       startActivityForResult(i, ACTIVITY_EDIT);
   }
   @Override
   protected void onActivityResult(int requestCode, int resultCode, 
                                   Intent intent) {
       super.onActivityResult(requestCode, resultCode, intent);
       fillData();
   }

}


NoteEdit.java

/*

* 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.notepad3;

import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText;

public class NoteEdit extends Activity {

private EditText mTitleText;

   private EditText mBodyText;
   private Long mRowId;
   private NotesDbAdapter mDbHelper;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // invokes the base class (Activity) constructor. 
       mDbHelper = new NotesDbAdapter(this);
       mDbHelper.open();
       // opens the database 'notes'
       setContentView(R.layout.note_edit);
       
      
       mTitleText = (EditText) findViewById(R.id.title);
       mBodyText = (EditText) findViewById(R.id.body);
     
       Button confirmButton = (Button) findViewById(R.id.confirm);
      // creates an instance of the class Button.
       mRowId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) 
               							: null;

if (mRowId == null) { Bundle extras = getIntent().getExtras(); mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null; }

populateFields();

       confirmButton.setOnClickListener(new View.OnClickListener() {
       	public void onClick(View view) {
       	    setResult(RESULT_OK);
       	    finish();
       	}
         
       });
   }
   
   private void populateFields() {
       if (mRowId != null) {
           Cursor note = mDbHelper.fetchNote(mRowId);
           // the method fetchNote() would return the position of the note
           // at mRowId
           startManagingCursor(note);
           mTitleText.setText(note.getString(
   	            note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
           mBodyText.setText(note.getString(
                   note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
       }
   }
   
   @Override
   protected void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
   }
   
   @Override
   protected void onPause() {
       super.onPause();
       saveState();
   }
   
   @Override
   protected void onResume() {
       super.onResume();
       populateFields();
   }
   
   private void saveState() {
       String title = mTitleText.getText().toString();
       String body = mBodyText.getText().toString();
       if (mRowId == null) {
           long id = mDbHelper.createNote(title, body);
           if (id > 0) {
               mRowId = id;
           }
       } else {
           mDbHelper.updateNote(mRowId, title, body);
       }
   }
   

}

Personal tools