Wednesday, December 14, 2011

Using your own SQLite database in Android applications



Most all of the Android examples and tutorials out there assume you want to create and populate your database at runtime and not to use and access an independent, preloaded database with your Android application.
The method I'm going to show you takes your own SQLite database file from the "assets" folder and copies into the system database path of your application so the SQLiteDatabase API can open and access it normally.
1. Preparing the SQLite database file.
Assuming you already have your sqlite database created, we need to do some modifications to it.
If you don't have a sqlite manager I recommend you to download the opensource SQLite Database Browser available for Win/Linux/Mac.
Open your database and add a new table called "android_metadata", you can execute the following SQL statement to do it:
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
Now insert a single row with the text 'en_US' in the "android_metadata" table:
INSERT INTO "android_metadata" VALUES ('en_US')
Then, it is necessary to rename the primary id field of your tables to "_id" so Android will know where to bind the id field of your tables.
You can easily do this with SQLite Database Browser by pressing the edit table button Edit Table, then selecting the table you want to edit and finally selecting the field you want to rename.
After renaming the id field of all your data tables to "_id" and adding the "android_metadata" table, your database it's ready to be used in your Android application.
Modified database
Modified database
Note: in this image we see the tables "Categories" and "Content" with the id field renamed to "_id" and the just added table "android_metadata".
2. Copying, opening and accessing your database in your Android application.
Now just put your database file in the "assets" folder of your project and create a Database Helper class by extending the SQLiteOpenHelper class from the "android.database.sqlite" package.
Make your DataBaseHelper class look like this:
public class DataBaseHelper extends SQLiteOpenHelper{
 
    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
 
    private static String DB_NAME = "myDBName";
 
    private SQLiteDatabase myDataBase; 
 
    private final Context myContext;
 
    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */
    public DataBaseHelper(Context context) {
 
     super(context, DB_NAME, null, 1);
        this.myContext = context;
    } 
 
  /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException{
 
     boolean dbExist = checkDataBase();
 
     if(dbExist){
      //do nothing - database already exist
     }else{
 
      //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
         this.getReadableDatabase();
 
         try {
 
       copyDataBase();
 
      } catch (IOException e) {
 
          throw new Error("Error copying database");
 
         }
     }
 
    }
 
    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){
 
     SQLiteDatabase checkDB = null;
 
     try{
      String myPath = DB_PATH + DB_NAME;
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
     }catch(SQLiteException e){
 
      //database does't exist yet.
 
     }
 
     if(checkDB != null){
 
      checkDB.close();
 
     }
 
     return checkDB != null ? true : false;
    }
 
    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{
 
     //Open your local db as the input stream
     InputStream myInput = myContext.getAssets().open(DB_NAME);
 
     // Path to the just created empty db
     String outFileName = DB_PATH + DB_NAME;
 
     //Open the empty db as the output stream
     OutputStream myOutput = new FileOutputStream(outFileName);
 
     //transfer bytes from the inputfile to the outputfile
     byte[] buffer = new byte[1024];
     int length;
     while ((length = myInput.read(buffer))>0){
      myOutput.write(buffer, 0, length);
     }
 
     //Close the streams
     myOutput.flush();
     myOutput.close();
     myInput.close();
 
    }
 
    public void openDataBase() throws SQLException{
 
     //Open the database
        String myPath = DB_PATH + DB_NAME;
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    }
 
    @Override
 public synchronized void close() {
 
         if(myDataBase != null)
          myDataBase.close();
 
         super.close();
 
 }
 
 @Override
 public void onCreate(SQLiteDatabase db) {
 
 }
 
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
 }
 
        // Add your public helper methods to access and get content from the database.
       // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
       // to you to create adapters for your views.
 
}
That's it.
Now you can create a new instance of this DataBaseHelper class and call the createDataBase() and openDataBase() methods. Remember to change the "YOUR_PACKAGE" to your application package namespace (i.e: com.examplename.myapp) in the DB_PATH string.
       ...
 
        DataBaseHelper myDbHelper = new DataBaseHelper();
        myDbHelper = new DataBaseHelper(this);
 
        try {
 
         myDbHelper.createDataBase();
 
  } catch (IOException ioe) {
 
   throw new Error("Unable to create database");
 
  }
 
  try {
 
   myDbHelper.openDataBase();
 
  }catch(SQLException sqle){
 
   throw sqle;
 
  }
 
        ...

Thursday, December 8, 2011

Android 4.0 Development Tutorial

Android 4.0 Development Tutorial

Development with Android Gingerbread and Eclipse

This tutorial describes how to create Android applications with Eclipse. It is based on Eclipse 3.7 (Indigo), Java 1.6 and Android 4.0 (Ice Cream Sandwich).

Table of Contents
1. What is Android?
1.1. Android Operation System
1.2. Important Android components
1.3. Dalvik Virtual Machine
1.4. Security and permissions
2. Android Application Architecture
2.1. AndroidManifest.xml
2.2. R.java, Resources and Assets
2.3. Reference to resources in XML files
2.4. Activities and Layouts
2.5. Activities and Lifecycle
2.6. Context
3. Installation
3.1. Eclipse and automatic Android SDK
3.2. Manually install Android SDK
3.3. Install a specific Android version
3.4. Android Source Code
4. Using the Emulator
4.1. Create an Android Emulator Device
4.2. Emulator Shortcuts
4.3. Performance
5. Error handling and typical problems
5.1. Clean Project
5.2. LogCat
5.3. Emulator does not start
5.4. Error message for @override
5.5. Missing Imports
5.6. Eclipse Tips
6. Your first Android project
6.1. Create Project
6.2. Two faces of things
6.3. Create attributes
6.4. Add UI Elements
6.5. Edit UI properties
6.6. Code your application
6.7. Start Project
7. Starting an deployed application
8. Menus and Action Bar
8.1. Definition of menu entries
8.2. Action bar tabs
8.3. Context menus
9. Tutorial: Menus and Action Bar
9.1. Project
9.2. Add a menu XML resource
10. Preferences
11. Tutorial: Preferences
11.1. Using preferences
11.2. Run
12. Dialogs via the AlertDialog
13. Layouts
14. TableLayout
14.1. Overview
14.2. Example
15. ContentProvider
15.1. Overview
15.2. Create contacts on your emulator
15.3. Using the Contact Content Provider
16. ScrollView
17. Fragments
17.1. Overview
17.2. When to use Fragments
18. Fragments Tutorial
18.1. Project and Overview
18.2. Create layouts
18.3. Create Fragment classes
18.4. Activities
18.5. Run
19. DDMS perspective and important views
19.1. DDMS - Dalvik Debug Monitor Server
19.2. LogCat View
19.3. File explorer
20. Shell
20.1. Android Debugging Bridge - Shell
20.2. Uninstall an application via adb
20.3. Emulator Console via telnet
21. Deploy your application on a real device
22. Thank you
23. Questions and Discussion
24. Links and Literature
24.1. Source Code
24.2. Android Resources
24.3. vogella Resources

Thursday, December 1, 2011

Android Live Design Preview Tool


Introducing Android Design Preview, a little utility for Mac/Windows/Linux that'll mirror a portion of your desktop screen (such as your Photoshop canvas) to your USB-connected Android device.


To see how it works, check out my screencast introducing the tool below.



As always, all the code is open sourced at http://code.google.com/p/android-ui-utils, and you can get a Mac Disk Image or an executable JAR for your Mac, Windows, or Linux machine here:






Note that Android Design Preview is still a fairly beta tool, so if you encounter bugs, please file them at the android-ui-utils open source project linked above.



Thanks!