1

I am trying to add values in the SQLite database at the time of table creation but code is stopping unexpectedly. I tried to check where its stooping by putting commands in log. both tables are succesfully creating. The problem is occuring when we're trying to insert the value in onCreate() meathod. Any suggestions, what's the problem?

package moin.WPG.databasecheck;


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;
import android.util.Log;

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 = "applicationManager";
    // Contacts table name
    private static final String TABLE_EMERGENCY_CONTACTS = "emerencyContacts";
    private static final String TABLE_PERSONAL_CONTACTS = "personalContacts";

    // 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";
    private static final String KEY_EMAIL_ID = "email_id";

    private static final String KEY_USER_ID = "userId";
    private static final String KEY_APP_PASSWORD = "app_password";
    private static final String KEY_USER_NAME = "user_name";

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

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {

        String CREATE_EMERGENCY_CONTACTS_TABLE = "CREATE TABLE " + TABLE_EMERGENCY_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT," + KEY_EMAIL_ID + " TEXT" + ")";
        db.execSQL(CREATE_EMERGENCY_CONTACTS_TABLE);
        Log.d("table","table created 1");

        String CREATE_PERSONAL_CONTACTS_TABLE = "CREATE TABLE " + TABLE_PERSONAL_CONTACTS + "("
                + KEY_USER_ID + " INTEGER PRIMARY KEY," + KEY_USER_NAME + " TEXT,"
                + KEY_APP_PASSWORD + " TEXT" + ")";
        db.execSQL(CREATE_PERSONAL_CONTACTS_TABLE);
        Log.d("table","table created 2");

        db = this.getWritableDatabase();

        ContentValues[] values = new ContentValues[3];
        for(int i=1;i<=3;i++){
        values[i-1].put(KEY_ID, i);
        values[i-1].put(KEY_NAME, "name"+i); // Contact Name
        values[i-1].put(KEY_PH_NO, "ph"+1);// Contact Phone
        values[i-1].put(KEY_EMAIL_ID, "id"+i);
        db.insert(TABLE_EMERGENCY_CONTACTS, null, values[i-1]);

        }
        Log.d("inserted","table 1");
        ContentValues values2 = new ContentValues();
        values2.put(KEY_USER_ID, 1);
        values2.put(KEY_USER_NAME, "username");
        values2.put(KEY_APP_PASSWORD, "password");
        db.insert(TABLE_PERSONAL_CONTACTS, null, values2);
        Log.d("inserted","table 2"); */
        db.close(); // Closing database connection

        Log.d("database","closing");
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS ");

        // 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_ID, contact.getID());
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber());// Contact Phone
        values.put(KEY_EMAIL_ID, contact.getEmailId());

        // Inserting Row
        db.insert(TABLE_EMERGENCY_CONTACTS, null, values);
        db.close(); // Closing database connection
    } */

    // Getting single contact
    Contact getEmergencyContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_EMERGENCY_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO, KEY_EMAIL_ID }, 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),cursor.getString(3));
        // return contact
        return contact;
    }

    UserInfo getUserInfo(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_PERSONAL_CONTACTS, new String[] { KEY_USER_ID,
                KEY_USER_NAME, KEY_APP_PASSWORD }, KEY_USER_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        UserInfo userInfo = new UserInfo(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));
        // return contact
        return userInfo;
    }
    // Getting All Contacts
   /* public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_EMERGENCY_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));
                contact.setEmailId(cursor.getString(2));
                // Adding contact to list
                contactList.add(contact);
            } while (cursor.moveToNext());
        }

        // return contact list
        return contactList;
    } */ 

    // Updating single contact
    public int updateEmergencyContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_ID, contact.getID());
        values.put(KEY_NAME, contact.getName());
        values.put(KEY_PH_NO, contact.getPhoneNumber());
        values.put(KEY_EMAIL_ID, contact.getEmailId());

        // updating row
        return db.update(TABLE_EMERGENCY_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
    }

    public int updateUserInfo(UserInfo userInfo) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_USER_ID, userInfo.getID());
        values.put(KEY_USER_NAME, userInfo.getName());
        values.put(KEY_APP_PASSWORD, userInfo.getPassword());

        // updating row
        return db.update(TABLE_PERSONAL_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(userInfo.getID()) });
    }
    // Deleting single contact
 /*   public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_EMERGENCY_CONTACTS, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
        db.close();
    } */

    // Getting contacts Count
   /* public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_EMERGENCY_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    } */

}

Here's the error log:

      4-13 12:20:08.727: D/table(754): table created 1
    04-13 12:20:08.747: D/table(754): table created 2
    04-13 12:20:08.757: D/AndroidRuntime(754): Shutting down VM
    04-13 12:20:08.766: W/dalvikvm(754): threadid=1: thread exiting with                          uncaught exception (group=0x409961f8)
    04-13 12:20:08.787: E/AndroidRuntime(754): FATAL EXCEPTION: main
    04-13 12:20:08.787: E/AndroidRuntime(754): java.lang.RuntimeException: Unable to start activity ComponentInfo{moin.WPG.databasecheck/moin.WPG.databasecheck.WPGDBActivity}: java.lang.IllegalStateException: getWritableDatabase called recursively
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.os.Handler.dispatchMessage(Handler.java:99)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.os.Looper.loop(Looper.java:137)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread.main(ActivityThread.java:4340)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at java.lang.reflect.Method.invokeNative(Native Method)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at java.lang.reflect.Method.invoke(Method.java:511)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at dalvik.system.NativeStart.main(Native Method)
    04-13 12:20:08.787: E/AndroidRuntime(754): Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:140)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at moin.WPG.databasecheck.DatabaseHandler.onCreate(DatabaseHandler.java:57)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at moin.WPG.databasecheck.DatabaseHandler.getEmergencyContact(DatabaseHandler.java:122)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at moin.WPG.databasecheck.WPGDBActivity.onCreate(WPGDBActivity.java:46)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.Activity.performCreate(Activity.java:4465)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    04-13 12:20:08.787: E/AndroidRuntime(754):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    04-13 12:20:08.787: E/AndroidRuntime(754):  ... 11 more
Moinuddin Quadri
  • 46,825
  • 13
  • 96
  • 126

1 Answers1

2

Don't call getWritableDatabase() or getReadableDatabase() in the SQLiteOpenHelper's methods as those methods call onCreate and you'll get yourself in a loop(and in trouble).

If you require a database reference use the SQLiteDatabase parameter as that is the new database:

@Override
public void onCreate(SQLiteDatabase db) {
    //...
    // when you need the database refercence just use db
    // DON'T call getWritableDatabase() and assign it to db
user
  • 86,916
  • 18
  • 197
  • 190
  • i tried that also but still it's showing error. Till table creation its working but during insertion its showing the error. Removing getWritableDatabase() also didn't worked – Moinuddin Quadri Apr 13 '13 at 08:05
  • @MoinuddinQuadri Do you get the exact same error? If not then post the stacktrace with the new exception. – user Apr 13 '13 at 08:41