Saturday, 18 April 2015

Android SQLite Database Tutorial

.
addContact()
    // Adding new contact
public void addContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.getName()); // Contact Name
    values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number
    // Inserting Row
    db.insert(TABLE_CONTACTS, null, values);
    db.close(); // Closing database connection
}

⇒Reading Row(s)

The following method getContact() will read single contact row. It accepts id as parameter and will return the matched row from the database.
getContact()
    // Getting single contact
public Contact getContact(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
            KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();
    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2));
    // return contact
    return contact;
}
getAllContacts() will return all contacts from database in array list format of Contact class type. You need to write a for loop to go through each contact.
getAllContacts()
    // Getting All Contacts
 public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<Contact>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setName(cursor.getString(1));
            contact.setPhoneNumber(cursor.getString(2));
            // Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }
    // return contact list
    return contactList;
}
getContactsCount() will return total number of contacts in SQLite database.
getContactsCount()
// Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();
        // return count
        return cursor.getCount();
    }

⇒Updating Record

updateContact() will update single contact in database. This method accepts Contact class object as parameter.
updateContact()
    // Updating single contact
public int updateContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.getName());
    values.put(KEY_PH_NO, contact.getPhoneNumber());
    // updating row
    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
}

⇒Deleting Record

deleteContact() will delete single contact from database.
deleteContact()
    // Deleting single contact
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}

Complete DatabaseHandler.java Code:

DatabaseHandler.java
package com.androidhive.androidsqlite;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper {
    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "contactsManager";
    // Contacts table name
    private static final String TABLE_CONTACTS = "contacts";
    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        // Create tables again
        onCreate(db);
    }
    /**
     * All CRUD(Create, Read, Update, Delete) Operations
     */
    // Adding new contact
    void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone
        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }
    // Getting single contact
    Contact getContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();
        Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));
        // return contact
        return contact;
    }
     
    // Getting All Contacts
    public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                contact.setID(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setPhoneNumber(cursor.getString(2));
                // Adding contact to list
                contactList.add(contact);
            } while (cursor.moveToNext());
        }
        // return contact list
        return contactList;
    }
    // Updating single contact
    public int updateContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName());
        values.put(KEY_PH_NO, contact.getPhoneNumber());
        // updating row
        return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
    }
    // Deleting single contact
    public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
        db.close();
    }
    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();
        // return count
        return cursor.getCount();
    }
}

Usage:

AndroidSQLiteTutorialActivity
package com.androidhive.androidsqlite;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AndroidSQLiteTutorialActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        DatabaseHandler db = new DatabaseHandler(this);
         
        /**
         * CRUD Operations
         * */
        // Inserting Contacts
        Log.d("Insert: ", "Inserting ..");
        db.addContact(new Contact("Ravi", "9100000000"));       
        db.addContact(new Contact("Srinivas", "9199999999"));
        db.addContact(new Contact("Tommy", "9522222222"));
        db.addContact(new Contact("Karthik", "9533333333"));
         
        // Reading all contacts
        Log.d("Reading: ", "Reading all contacts..");
        List<Contact> contacts = db.getAllContacts();      
         
        for (Contact cn : contacts) {
            String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
                // Writing Contacts to log
        Log.d("Name: ", log);
    }
    }
}

Android Log Cat Report:

I am writing output to Log report. You can see your log report by going to Windows ⇒ Show View ⇒ Other.. ⇒ Android ⇒ Log Cat.
Android Log Cat
Android Log Cat
Android Output log report

Tuesday, 17 March 2015

Android XML Parsing Using Sax Parser Over Http

XML Stands For Extensible Mark-up Language  that defines a set of rules for encoding documents in a format which is both human-readable , android sdk provides api called SAXParse using which you can parse the xml format data . you can also parse xml using DOM Parse but the advantage of SAX Parser Over DOM Parse is It consumes less memory than DOM.



Here In this tutorial we are going to parse the xml over http which is located at 
http://api.tutorialsbuzz.com/emp/employees.xml


HTTP Request And Response Handler


Create a Class ServiceRequest the purpose of this class is to make http request and get response , there are two types of request POST and GET for which i have defined two methods inside this class
  •     MakePostRequest() .
  •     MakeGetRequest() .
Depending upon your request type make call to either of these methods

file: ServiceRequest.java
package com.tutorialsbuzz.saxparserdemo;

import java.net.URI;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class ServiceRequest {

    HttpPost httppost;
    HttpGet httpget;
    HttpEntity entity;
    HttpResponse response = null;
    HttpClient client = new DefaultHttpClient();
    URI website = null;

    String url;
    List<NameValuePair> params;

    public ServiceRequest(String url, List<NameValuePair> params) {
        this.url = url;
        this.params = params;
    }

    public String MakePostRequest() {

        try {
            website = new URI(url);
            httppost = new HttpPost();
            if (params != null) {
                httppost.setEntity(new UrlEncodedFormEntity(params));
            }
            httppost.setURI(website);
            response = client.execute(httppost);
            entity = response.getEntity();
            return EntityUtils.toString(entity);

        } catch (Exception e) {
            return e.toString();
        }

    }

    public String MakeGetRequest() {
        try {
            if (params != null) {
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
            }
            website = new URI(url);
            httpget = new HttpGet();
            httpget.setURI(website);
            response = client.execute(httpget);
            entity = response.getEntity();

            return EntityUtils.toString(entity);

        } catch (Exception e) {
            return "some error";
        }
    }

}

SaxParser


Create a Class SAXXMLHandler and extends this class to DefaultHandler and override the startElement() , characters() and endElement() methods. here in this class we parse xml and store .

file: SAXXMLHandler.java
package com.tutorialsbuzz.saxparserdemo;

import java.util.ArrayList;
import java.util.HashMap;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXXMLHandler extends DefaultHandler {

    private String tempVal;
    ArrayList<HashMap<String, String>> empList;
    HashMap<String, String> hm;

    public SAXXMLHandler() {
        empList = new ArrayList<HashMap<String, String>>();
    }

    public ArrayList<HashMap<String, String>> getEmplist() {
        return empList;
    }

    // Event Handlers
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // reset
        tempVal = "";

        if (qName.equalsIgnoreCase("employee")) {
            // create a new instance of employee
            hm = new HashMap<String, String>();
        }
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        tempVal = new String(ch, start, length);
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equalsIgnoreCase("employee")) {
            // add it to the list
            empList.add(hm);

        } else if (qName.equalsIgnoreCase("id")) {

            hm.put("id", tempVal);

        } else if (qName.equalsIgnoreCase("name")) {

            hm.put("name", tempVal);
        } else if (qName.equalsIgnoreCase("department")) {

            hm.put("dept", tempVal);

        } else if (qName.equalsIgnoreCase("email")) {

            hm.put("email", tempVal);
        }
    }
}

Create a class SAXXMLParser and  add a static method parse() which takes inputstream as parameter and returns arraylist of hasmap .

file: SAXXMLParser.java
package com.tutorialsbuzz.saxparserdemo;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.util.Log;

public class SAXXMLParser {
    public static ArrayList<HashMap<String, String>> parse(InputStream is) {

        ArrayList<HashMap<String, String>> empList = null;

        try {
            // create a XMLReader from SAXParser
            XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser()
                    .getXMLReader();
            // create a SAXXMLHandler
            SAXXMLHandler saxHandler = new SAXXMLHandler();

            // store handler in XMLReader
            xmlReader.setContentHandler(saxHandler);
            // the process starts
            xmlReader.parse(new InputSource(is));
            // get the `Employee list`
            empList = saxHandler.getEmplist();

        } catch (Exception ex) {
            Log.d("XML", "SAXXMLParser: parse() failed");
        }

        // return Employee list
        return empList;
    }
}


XML Layout


Create XML Layout file list_items.xml , this xml layout represents the row items of listview to which  display xml data .

file:list_items.xml
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tutorialsbuzz.saxparserdemo.MainActivity" >

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:textColor="#000000"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/name"
        android:layout_below="@+id/name"
        android:text="TextView"
        android:textColor="#000000"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/dept"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="TextView"
        android:textColor="#000000" />

</RelativeLayout>

ListActivity


Create a class MainActivity and extend this class to ListActivity .
Create an inner class MyTask which extends the AsyncTask .
Inside the doInBackground() method parse the xml and finally inside the onPostExecute() method update the listview .

file: MainActivity
package com.tutorialsbuzz.saxparserdemo;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity {

    ArrayList<HashMap<String, String>> empList;
    ProgressDialog PD;
    ServiceRequest service_request;
    String webdata;
    SAXParser saxParser;
    InputStream is;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SAXParserFactory factory = SAXParserFactory.newInstance();

        try {
            saxParser = factory.newSAXParser();
        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        }

        new MyTask().execute();

    }

    class MyTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            PD = new ProgressDialog(MainActivity.this);
            PD.setMessage("Loading...");
            PD.setCancelable(false);
            PD.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {

            service_request = new ServiceRequest(
                    "http://api.tutorialsbuzz.com/emp/employees.xml", null);

            webdata = service_request.MakeGetRequest();

            is = new ByteArrayInputStream(webdata.getBytes());

            empList = SAXXMLParser.parse(is);

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            String[] from = { "name", "email", "dept" };
            int[] to = { R.id.name, R.id.email, R.id.dept };

            ListAdapter adapter = new SimpleAdapter(getApplicationContext(),
                    empList, R.layout.list_items, from, to);

            setListAdapter(adapter);

            PD.dismiss();

        }
    }

}

Finally Add Internet Permission Inside the Manifest file .

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
   ........
   .......



Friday, 27 February 2015

Binding JavaScript & Android Code

During Android web application development sometimes we may require to communicate withclient-side android application. For this Android provides an interface between JavaScript code andclient-side Android code.
Example: On click of some button we may require to open another activity.
So lets see in this tutorial how we can do this by binding JavaScript with Android code.

Steps to bind JavaScript code to Android code

1) Create a class with required methods which needs to be invoked by JavaScript code.

In our example we will open next activity on click of a button.

2) Add Javascript Interface in android code.

To bind interface between javascript and android code, andorid provides addJavascriptInterface() method.
addJavascriptInterface(Object object, String name);
  • Object : specified instance of your created class.
  • Name : pass any string value which will be used in JavaScript code to call an android function.
Example :

 3) Create HTML code to call android methods.

So when you run application and click on that button it will open next screen. In this way you can bind JavaScript interface into android code. Post your comments if you have any questions ?