Teams Winter 2011/team5/lab5/tutorial

From CDOT Wiki
Jump to: navigation, search

Create Android Project

1.1 Setup Eclipse with the ADT plugin as directed to ttp://www.vogella.de/articles/Android/article.html#installation here] 1.2. Create a new android project in your eclipse: File -> New -> Android Project:

Database Helper

Add in the following code:


package dps914.team5.lab3;

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.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DAL {
	private static final String TAG = DAL.class.getSimpleName();

	private static final String DATABASE_NAME = "mybooks.db";
	private static final String DATABASE_TABLE = "mybooks_table";
	private static final int DATABASE_VERSION = 1;
	private static final String CREATE_TABLE = "create table " + DATABASE_TABLE
			+ " (_id integer primary key autoincrement, " + "name text not null,"
			+ "author text," + "publisher text," + "category text" + ");";

	private Context ctx;
	private SQLiteDatabase db;
	private OpenHelper oh;

	public static final String KEY_NAME = "name";
	public static final String KEY_AUTHOR = "email_address";
	public static final String KEY_PUBLISHER = "mobile";
	public static final String KEY_CATEGORY = "home_address";
	public static final String KEY_ROW_ID = "_id";

	private static final String QUERY_NAME = "SELECT _id, name from "
			+ DATABASE_TABLE + " WHERE " + KEY_NAME + " LIKE ?";

	public DAL(Context context) {
		ctx = context;
	}

	public DAL open() {
		try {
			oh = new OpenHelper(ctx);
			db = oh.getWritableDatabase();
			return this;
		} catch (SQLException e) {
			Log.d(TAG, "OPEN: failed ");
			return null;
		}
	}

	public void close() {
		oh.close();
	}

	public Long createBook(String name, String emailAddress, String mobile,
			String homeAddress) {
		ContentValues initialValues = new ContentValues();
		initialValues.put(KEY_NAME, name);
		initialValues.put(KEY_AUTHOR, emailAddress);
		initialValues.put(KEY_PUBLISHER, mobile);
		initialValues.put(KEY_CATEGORY, homeAddress);
		return db.insert(DATABASE_TABLE, null, initialValues);
	}

	public void deleteBook(long rowId) {
		db.delete(DATABASE_TABLE, KEY_ROW_ID + "=" + rowId, null);
	}

	public Cursor getAllBooks() {
		try {

			return db.query(DATABASE_TABLE, new String[]{KEY_ROW_ID, KEY_NAME,
					KEY_AUTHOR, KEY_PUBLISHER, KEY_CATEGORY}, null, null, null, null,
					null);

		} catch (SQLiteException e) {
			Log.e(TAG, "Exception on query ALL BOOKS");
			return null;
		}
	}

	public Cursor getBook(long rowId) throws SQLException {

		Cursor c = db.query(true, DATABASE_TABLE, new String[]{KEY_ROW_ID,
				KEY_NAME, KEY_AUTHOR, KEY_PUBLISHER, KEY_CATEGORY}, KEY_ROW_ID + "="
				+ rowId, null, null, null, null, null);
		if (c != null) {
			c.moveToFirst();
		}
		return c;

	}

	public Cursor getAllBooks(String name) {
		try {
			Cursor c = db.rawQuery(QUERY_NAME, new String[]{name});
			return c;

		} catch (SQLiteException e) {
			Log.e(TAG, "Exception on query ALL BOOKS");
			return null;
		}
	}

	public boolean updateBook(long rowId, String name, String emailAddress,
			String mobile, String homeAddress) {
		ContentValues cv = new ContentValues();
		cv.put(KEY_NAME, name);
		cv.put(KEY_AUTHOR, emailAddress);
		cv.put(KEY_PUBLISHER, mobile);
		cv.put(KEY_CATEGORY, homeAddress);
		return db.update(DATABASE_TABLE, cv, KEY_ROW_ID + "=" + rowId, null) > 0;
	}

	private static class OpenHelper extends SQLiteOpenHelper {

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

		@Override
		public void onCreate(SQLiteDatabase db) {
			Log.d(TAG, "onCreate sql " + CREATE_TABLE);
			db.execSQL(CREATE_TABLE);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
			onCreate(db);
		}

	}
}

First Activity Code - Book Manager


package dps914.team5.lab3;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;

public class team5lab extends ListActivity {
	private DAL h;
	private Cursor c;
	private static final String TAG = team5lab.class.getSimpleName();
	private static final int ACTIVITY_CREATE = 0;
	private static final int ACTIVITY_EDIT = 1;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.show_books);
		h = new DAL(team5lab.this);
		h.open();
		displayData();
		registerForContextMenu(getListView());
    }

	private void displayData() {
		c = h.getAllBooks();
		startManagingCursor(c);
		ListAdapter adapter = new SimpleCursorAdapter(this,
				R.layout.book_row, c, new String[] {
						DAL.KEY_NAME, DAL.KEY_AUTHOR,
						DAL.KEY_ROW_ID }, new int[] { R.id.name, R.id.author });
		setListAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.create_menu, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case R.id.book_create:
			Log.d(TAG, "onOptItemSelected-create");
			Intent i = new Intent(this, EditBookActivity.class);
			startActivityForResult(i, ACTIVITY_CREATE);
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.context_menu, menu);
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		switch (item.getItemId()) {

		case R.id.book_delete:
			AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
					.getMenuInfo();
			h.deleteBook(info.id);
			displayData();
			return true;

		case R.id.book_update:
			Intent i = new Intent(this, EditBookActivity.class);
			AdapterContextMenuInfo infoItem = (AdapterContextMenuInfo) item
					.getMenuInfo();
			i.putExtra(DAL.KEY_ROW_ID, infoItem.id);
			startActivityForResult(i, ACTIVITY_EDIT);
			Log.d(TAG, "Update Contact Info");
			return true;

		}
		return super.onMenuItemSelected(featureId, item);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		super.onActivityResult(requestCode, resultCode, intent);
		displayData();
	}
}

First Activity Layout


<?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">
	
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:id="@+id/titleTextView"
		android:text="@string/titleTextView" android:textStyle="bold"
		android:textSize="20dp" android:gravity="center_vertical"
		android:layout_gravity="center"></TextView>

	<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent" android:layout_height="wrap_content">

		<EditText android:id="@+id/searchText" android:layout_width="fill_parent"
			android:layout_height="wrap_content" android:layout_weight="1" />

		<Button android:id="@+id/searchButton" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="@string/searchButton" />

	</LinearLayout>

	<ListView android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:id="@+id/android:list"/>

</LinearLayout>

And a list layout:


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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:layout_gravity="fill_horizontal">

	<TextView android:id="@+id/name" android:text="@string/view_name"
		android:layout_gravity="left" android:height="30dp"
		android:layout_height="wrap_content" android:layout_width="wrap_content"
		android:layout_weight=".60" />
		
	<TextView android:layout_height="wrap_content" android:id="@+id/author"
		android:text="@string/view_author" android:layout_width="wrap_content"
		android:layout_gravity="right" android:layout_weight=".40" />
</LinearLayout>

First Activity Menus


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

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/book_create" android:title="Create Book"></item>
	
</menu>

First Activity Context Menu


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

<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:title="@string/menu_update" android:id="@+id/book_update" />
	<item android:title="@string/menu_delete" android:id="@+id/book_delete" />

</menu>

Edit Activity Code


package dps914.team5.lab3;

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

public class EditBookActivity extends Activity {
	private final static String TAG = EditBookActivity.class.getSimpleName();

	private DAL h;
	private Long rowId;

	private String name;
	private String emailAddress;
	private String phone;
	private String homeAddress;

	private EditText nameEditText;
	private EditText emailAddressEditText;
	private EditText phoneEditText;
	private EditText homeAddressEditText;
	private Button saveButton;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.edit_book);
		h = new DAL(EditBookActivity.this);
		h.open();

		getWidgets();

		rowId = (savedInstanceState == null) ? null : (Long) savedInstanceState
				.getSerializable(DAL.KEY_ROW_ID);
		if (rowId == null) {
			Bundle extras = getIntent().getExtras();
			rowId = extras != null
					? extras.getLong(DAL.KEY_ROW_ID)
					: null;
		}

		fillContactInfo();

		saveButton.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				setResult(RESULT_OK);
				finish();
			}

		});
	}

	private void fillContactInfo() {
		if (rowId != null) {
			Cursor c = h.getBook(rowId);
			startManagingCursor(c);
			nameEditText.setText(c.getString(c
					.getColumnIndexOrThrow(DAL.KEY_NAME)));
			emailAddressEditText.setText(c.getString(c
					.getColumnIndexOrThrow(DAL.KEY_AUTHOR)));
			phoneEditText.setText(c.getString(c
					.getColumnIndexOrThrow(DAL.KEY_PUBLISHER)));
			homeAddressEditText.setText(c.getString(c
					.getColumnIndexOrThrow(DAL.KEY_CATEGORY)));
		}
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		saveState();
		outState.putSerializable(DAL.KEY_ROW_ID, rowId);
	}

	@Override
	protected void onPause() {
		super.onPause();
		saveState();
	}

	@Override
	protected void onResume() {
		super.onResume();
		fillContactInfo();
	}

	private void saveState() {
		name = nameEditText.getText().toString();
		emailAddress = emailAddressEditText.getText().toString();
		phone = phoneEditText.getText().toString();
		homeAddress = homeAddressEditText.getText().toString();

		if (rowId == null) {
			long id = h.createBook(name, emailAddress, phone, homeAddress);
			if (id > 0) {
				rowId = id;
			}
			Log.d(TAG, "INSERT ROW " + rowId);
		} else {
			h.updateBook(rowId, name, emailAddress, phone, homeAddress);
		}
	}

	private void getWidgets() {
		nameEditText = (EditText) findViewById(R.id.name_editText);
		emailAddressEditText = (EditText) findViewById(R.id.author_editText);
		phoneEditText = (EditText) findViewById(R.id.publisher_editText);
		homeAddressEditText = (EditText) findViewById(R.id.category_editText);
		saveButton = (Button) findViewById(R.id.saveContact_button);
	}
}

Edit Activity Layouts


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent" android:layout_height="match_parent"
	android:orientation="vertical">
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:id="@+id/titleTextView"
		android:gravity="center_vertical" android:textSize="30dp"
		android:text="" android:layout_gravity="center"></TextView>


	<EditText android:layout_width="match_parent"
		android:layout_height="wrap_content" android:id="@+id/name_editText"
		android:hint="Title" android:layout_marginBottom="3dp"></EditText>


	<EditText android:layout_width="match_parent"
		android:layout_height="wrap_content" android:id="@+id/author_editText"
		android:hint="Author" android:isScrollContainer="true"
		android:layout_marginBottom="3dp"></EditText>


	<EditText android:layout_width="match_parent"
		android:layout_height="wrap_content" android:id="@+id/publisher_editText"
		android:layout_marginBottom="3dp" android:hint="Publisher"></EditText>


	<EditText android:layout_width="match_parent"
		android:layout_height="wrap_content" android:id="@+id/category_editText"
		android:layout_marginBottom="3dp" android:hint="Category"></EditText>


	<Button android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:id="@+id/saveContact_button"
		android:text="Save" android:gravity="center_horizontal"
		android:layout_gravity="center_horizontal" android:textSize="20dp"></Button>
</LinearLayout>