Fitri Izuan
Fitri Izuan

Reputation: 370

Android Development: Error calling method in MySQLHelper

I am newbie here in StackOverFlow and also in Android Development. Actually, this is my first real project for developing an android application.

I have a problem when calling a function or method named as deleteDictionary() from my MySQLiteDefinitionHelper. I call the method from my DefinitionHomeActivity by trigger it with onItemLongCLick, then a dialog menu will pop out to choose the option which are add, view and delete. The method then will be truly triggered once the user click on the delete option.

At the beginning, I want to use the method to drop a table in a database. But, an error has occur and caused the apps to stop when trigger the event.

I assume maybe it relates to database error. Then I change the function to do some Log.d() and commenting all the code which has database operation, but the same error still occur.

I have refer many resource from the Internet and change a little of my coding but still didn't change anything. I hope someone may help me and explain what actually has happened. Thank you.

This is my Bean Java file named DefinitionObject.java

    package com.example.myidictionary;

    public class DefinitionObject {

private int id;
private String word;
private String definition;
private String example;
private String sentence;

public DefinitionObject()
{

}

public DefinitionObject(int id, String word, String definition,
        String example, String sentence) {
    super();
    this.id = id;
    this.word = word;
    this.definition = definition;
    this.example = example;
    this.sentence = sentence;
}

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getWord() {
    return word;
}
public void setWord(String word) {
    this.word = word;
}
public String getDefinition() {
    return definition;
}
public void setDefinition(String definition) {
    this.definition = definition;
}
public String getExample() {
    return example;
}
public void setExample(String example) {
    this.example = example;
}
public String getSentence() {
    return sentence;
}
public void setSentence(String sentence) {
    this.sentence = sentence;
}

@Override
public String toString() {
    /*return "getId= " + getId() + ",\n getWord= "
            + getWord() + ",\n getDefinition= " + getDefinition()
            + ",\n getExample= " + getExample() + ",\n getSentence="
            + getSentence() +"\n\n";*/

    return word;
}


    }

This is my MySQLiteDefinitionHelper.java

     package com.example.myidictionary;

     import java.util.ArrayList;
     import java.util.LinkedList;
     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;
     import android.widget.Toast;

     import com.example.myidictionary.TableName;

    public class MySQLiteDefinitionHelper extends SQLiteOpenHelper {



//db version
private static final int DATABASE_VERSION = 1;
// db name
private static final String DATABASE_NAME = "DefinitionDB";

// Table Columns names
private static final String KEY_ID = "d_id";
private static final String KEY_WORD = "d_word";
private static final String KEY_DEFINITION = "d_definition";
private static final String KEY_EXAMPLE = "d_example";
private static final String KEY_SENTENCE = "d_sentence";

private static final String[] COLUMNS = {KEY_ID,KEY_WORD,KEY_DEFINITION,KEY_EXAMPLE,KEY_SENTENCE};

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

@Override
public void onCreate(SQLiteDatabase db) {
    //SQL statement to create ? table
    db.execSQL("CREATE TABLE DefinitionTable (" + 
            KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            KEY_WORD + " TEXT NOT NULL, " +
            KEY_DEFINITION + " TEXT NOT NULL, " + 
            KEY_EXAMPLE + " TEXT, " +
            KEY_SENTENCE + " TEXT)");
    //db.rawQuery("CREATE TABLE books (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT )", null);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //drop table if exists
    db.execSQL("DROP TABLE IF EXISTS " + TableName.getTblName());
    //create fresh definition table
    this.onCreate(db);
}

public void createDefinitionTable(SQLiteDatabase db)
{
    //SQL statement to create ? table
    db.execSQL("CREATE TABLE "+ TableName.getTblName()+" (" + 
            KEY_ID+ " INTEGER PRIMARY KEY, " + 
            KEY_WORD+ " TEXT NOT NULL, " +
            KEY_DEFINITION+ " TEXT NOT NULL, " + 
            KEY_EXAMPLE+ " TEXT, " +
            KEY_SENTENCE+ " TEXT");
}




//----------------------------------------------- CRUD operations
public void addDefinition(DefinitionObject defObj)
{
    Log.d("addDefinition", defObj.toString());

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. create ContentValues to add key "column"/value
    ContentValues values = new ContentValues();
    values.put(KEY_ID, defObj.getId());
    values.put(KEY_WORD, defObj.getWord()); // get title 
    values.put(KEY_DEFINITION, defObj.getDefinition());
    values.put(KEY_EXAMPLE, defObj.getExample());
    values.put(KEY_SENTENCE, defObj.getSentence());// get author

    // 3. insert
    db.insert(TableName.getTblName(), // table
            null, //nullColumnHack
            values); // key/value -> keys = column names/ values = column values

    // 4. close
    db.close(); 
}


public DefinitionObject getDefObj(int id, String name){

    // 1. get reference to readable DB
    SQLiteDatabase db = this.getReadableDatabase();

    // 2. build query
    Cursor cursor = 
            db.query(TableName.getTblName(), // a. table
                    COLUMNS, // b. column names
                    " id = ?", // c. selections 
                    new String[] { String.valueOf(id) }, // d. selections args
                    null, // e. group by
                    null, // f. having
                    null, // g. order by
                    null); // h. limit

    // 3. if we got results get the first one
    if (cursor != null)
        cursor.moveToFirst();

    // 4. build book object
    DefinitionObject defObj = new DefinitionObject();
    defObj.setId(Integer.parseInt(cursor.getString(0)));
    defObj.setWord(cursor.getString(1));
    defObj.setDefinition(cursor.getString(2));
    defObj.setExample(cursor.getString(3));
    defObj.setSentence(cursor.getString(4));

    Log.d("getDefObj("+id+")", defObj.toString());

    cursor.close();
    // 5. return book
    return defObj;
}

// Get All Books
public List<DefinitionObject> getAllWords(String tblName) {
    List<DefinitionObject> defObjs = new LinkedList<DefinitionObject>();

    // 1. build the query
    String query = "SELECT * FROM " + tblName;

    // 2. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);

    // 3. go over each row, build book and add it to list
    DefinitionObject defObj = null;
    if (cursor.moveToFirst()) {
        do {
            defObj = new DefinitionObject();
            defObj.setId(Integer.parseInt(cursor.getString(0)));
            defObj.setWord(cursor.getString(1));
            defObj.setDefinition(cursor.getString(2));
            defObj.setExample(cursor.getString(3));
            defObj.setSentence(cursor.getString(4));

            // Add book to books
            defObjs.add(defObj);
        } while (cursor.moveToNext());
    }

    Log.d("getAllDefinitionObject()", defObjs.toString());
    cursor.close();
    // return books
    return defObjs;
}

/*public List<DefinitionObject> getAllWords(String tblName) {
    List<DefinitionObject> defObjs = new ArrayList<DefinitionObject>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("Select d_word from " + tblName, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        DefinitionObject defObj = cursorToDefObject(cursor);
        defObjs.add(defObj);
      cursor.moveToNext();
    }
    // Make sure to close the cursor
    cursor.close();
    return defObjs;
  }

  private DefinitionObject cursorToDefObject(Cursor cursor) {
      DefinitionObject defObj = new DefinitionObject();
      defObj.setId(cursor.getInt(0));
      defObj.setWord(cursor.getString(1));
      defObj.setDefinition(cursor.getString(2));
      defObj.setExample(cursor.getString(3));
      defObj.setSentence(cursor.getString(4));

    return defObj;
  }*/

/*public String getAllWords2(String tblName) {
      String words = "Received";
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery("Select d_word from " + tblName, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            words+= cursor.getString(0) + "\n";
          cursor.moveToNext();
        }
        // Make sure to close the cursor
        cursor.close();
        return words;
      }*/


// Updating single book
public int updateDefinitionObject(DefinitionObject defObj) {

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. create ContentValues to add key "column"/value
    ContentValues values = new ContentValues();
    values.put(KEY_WORD, defObj.getWord()); 
    values.put(KEY_DEFINITION, defObj.getDefinition()); 
    values.put(KEY_EXAMPLE, defObj.getExample());
    values.put(KEY_SENTENCE, defObj.getSentence());

    // 3. updating row
    int i = db.update(TableName.getTblName(), //table
            values, // column/value
            KEY_ID+" = ?", // selections
            new String[] { String.valueOf(defObj.getId()) }); //selection args

    // 4. close
    db.close();

    return i;

}


// Deleting single book
public void deleteDefinitionObject(DefinitionObject defObj) {

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. delete
    db.delete(TableName.getTblName(),
            KEY_ID+" = ?",
            new String[] { String.valueOf(defObj.getId()) });

    // 3. close
    db.close();

    Log.d("deleteBook", defObj.toString());

}




public ArrayList<String> listDictionary()
{
    ArrayList<String> stringList = new ArrayList<String>();
    String result="";
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name != 'android_metadata' AND name != 'sqlite_sequence' AND name != 'DefinitionTable'", null);

    if (c.moveToFirst()) {
        while ( !c.isAfterLast() ) {
            result= c.getString(0) +"";
            stringList.add(result);
            //Toast.makeText(activityName.this, "Table Name=> "+c.getString(0), Toast.LENGTH_LONG).show();
            c.moveToNext();
        }
    }
    c.close();
    return stringList;
}

public int countDictionary()
{
    int count = 0;
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type = 'table' AND name != 'android_metadata' AND name != 'sqlite_sequence' AND name != 'DefinitionTable'", null);

    if (c.moveToFirst()) {
        while ( !c.isAfterLast() ) {
            count = c.getCount();
            c.moveToNext();
        }
    }
    c.close();
    return count;
}

//createDefinitionDIctionary
public void createDictionary(String tblname) {
    //SQL statement to create ? table

    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("CREATE TABLE "+ tblname +"(d_id INTEGER PRIMARY KEY AUTOINCREMENT, d_word TEXT NOT NULL,d_definition TEXT NOT NULL,d_example TEXT,d_sentece TEXT)");
}

public void deleteDictionary(String tblname)
{
    //SQLiteDatabase db = this.getWritableDatabase();
    //db.execSQL("DROP TABLE "+ tblname);
    //Toast.makeText(getApplicationContext(),  "View", Toast.LENGTH_SHORT).show();
    Log.d("DELETE_TABLE", tblname);
}
    }

This is my activity named DefinitionHomeActivity.java

    package com.example.myidictionary;


    import java.util.ArrayList;

    import android.app.ActionBar;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.Window;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;

    public class DefinitionHomeActivity extends Activity {

private MySQLiteDefinitionHelper db;
public final static String TABLENAME="com.example.myidictionary.TABLENAME";
String mesej;
ArrayList<String> listDictionary;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    setContentView(R.layout.definition_home);

    //============================ action Bar ===========================
    ActionBar actionBar = getActionBar();
    actionBar.show();
    actionBar.setDisplayHomeAsUpEnabled(true);//icon -> go to home
    //---------------------------- action Bar --------------------------- 



    //=================== get mesej from other activity ============================
    Intent msjIntent = getIntent();
    mesej = msjIntent.getStringExtra(CreateDefinitionDictionaryActivity.MESSAGE);
    if(mesej != null)
    {
        Toast.makeText(getApplicationContext(), "New Dictionary named " + mesej + " was created!", Toast.LENGTH_SHORT).show();
    }
    //-------------------- get mesej from other activity ---------------------------



    //============================ Set ListView Items =============================================
    db = new MySQLiteDefinitionHelper(this);
    ListView mylist = (ListView)findViewById(R.id.listDictionary);
    listDictionary = new ArrayList<String>();
    listDictionary = db.listDictionary();

    //  ~~~~~~~                    if list is empty                       ~~~~~~~ 
    if(listDictionary.isEmpty()== true)
    {
        Toast.makeText(getApplicationContext(),  "There is no Dictionary Exist", Toast.LENGTH_SHORT).show();
    }
    //  ~~~~~~                     if list is empty                       ~~~~~~ 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, listDictionary);
    mylist.setAdapter(adapter);
    //---------------------------- Set ListView Items -----------------------------------------------



    //=========================== Set On Item CLick ============================================
    mylist.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
        {
            // TODO Auto-generated method stub
            String selectedTable=listDictionary.get(arg2);
            Toast.makeText(getApplicationContext(),  "Dictionary : "+selectedTable, Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(DefinitionHomeActivity.this, WordDefinitionHomeActivity.class);
            intent.putExtra(TABLENAME, selectedTable);
            startActivity(intent);
        }

    });
    //----------------------------- Set On Item CLick -------------------------------------------


    // ================================= Set Dialog Menu Options =========================================
    final String[] option = new String[] { "Add", "View", "Delete" }; 
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, option);
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Select Option"); 
    builder.setAdapter(adapter2, new DialogInterface.OnClickListener() 
    { 
        public void onClick(DialogInterface dialog, int which) 
        { // TODO Auto-generated method stub 
            switch(which){
            case 0: 
                Toast.makeText(getApplicationContext(),  "Add", Toast.LENGTH_SHORT).show();
                break;
            case 1: 
                Toast.makeText(getApplicationContext(),  "View", Toast.LENGTH_SHORT).show();
                break;
            case 2: 
                Toast.makeText(getApplicationContext(),  "Delete", Toast.LENGTH_SHORT).show();
                //data = new MySQLiteDefinitionHelper(DefinitionHomeActivity.this);
                db.deleteDictionary(mesej);
                break;
            default:
                // nothing
                break;
            }
        } 

    }); 

    final AlertDialog dialog = builder.create(); 
    // --------------------------------- Set Dialog Menu Options ---------------------------------------


    // =============================== Set On Item Long CLick ======================================
    mylist.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
    {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
        {
            //show dialog menu options box
            dialog.show(); 

            return true;
        }
    });
    // ------------------------------- Set On Item Long CLick ----------------------------------------



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.definition_home, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    boolean ret=false;
    if(item.getItemId() == R.id.createDictionary)
    {
        ret = true;
        Intent intent = new Intent(this, CreateDefinitionDictionaryActivity.class);
        startActivity(intent); 

    }
    else 
    {

    }

    //Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();

    return ret;
}

    }

This is my logCat named log.txt

    10-17 10:46:28.171: E/Trace(3552): error opening trace file: No such file or directory (2)
    10-17 10:46:39.010: E/AndroidRuntime(3552): FATAL EXCEPTION: main
    10-17 10:46:39.010: E/AndroidRuntime(3552): java.lang.NullPointerException: println needs a message
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.util.Log.println_native(Native Method)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.util.Log.d(Log.java:138)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at com.example.myidictionary.MySQLiteDefinitionHelper.deleteDictionary(MySQLiteDefinitionHelper.java:309)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at com.example.myidictionary.DefinitionHomeActivity$2.onClick(DefinitionHomeActivity.java:109)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.widget.AbsListView$1.run(AbsListView.java:3423)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.os.Handler.handleCallback(Handler.java:725)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.os.Handler.dispatchMessage(Handler.java:92)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.os.Looper.loop(Looper.java:137)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at android.app.ActivityThread.main(ActivityThread.java:5039)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at java.lang.reflect.Method.invokeNative(Native Method)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at java.lang.reflect.Method.invoke(Method.java:511)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    10-17 10:46:39.010: E/AndroidRuntime(3552):     at dalvik.system.NativeStart.main(Native Method)
    10-17 10:49:04.652: E/AndroidRuntime(3628): FATAL EXCEPTION: main
    10-17 10:49:04.652: E/AndroidRuntime(3628): java.lang.NullPointerException: println needs a message
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.util.Log.println_native(Native Method)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.util.Log.d(Log.java:138)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at com.example.myidictionary.MySQLiteDefinitionHelper.deleteDictionary(MySQLiteDefinitionHelper.java:309)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at com.example.myidictionary.DefinitionHomeActivity$2.onClick(DefinitionHomeActivity.java:109)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.widget.AbsListView$1.run(AbsListView.java:3423)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.os.Handler.handleCallback(Handler.java:725)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.os.Handler.dispatchMessage(Handler.java:92)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.os.Looper.loop(Looper.java:137)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at android.app.ActivityThread.main(ActivityThread.java:5039)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at java.lang.reflect.Method.invokeNative(Native Method)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at java.lang.reflect.Method.invoke(Method.java:511)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    10-17 10:49:04.652: E/AndroidRuntime(3628):     at dalvik.system.NativeStart.main(Native Method)
    10-17 10:49:08.083: E/Trace(3652): error opening trace file: No such file or directory (2)

Upvotes: 2

Views: 355

Answers (2)

janos
janos

Reputation: 124714

This is how you can read a stack trace:

  • A NullPointerException was thrown by android.util.Log.println_native
  • The lines under it shows what called it: android.util.Log.d
  • You keep reading the lines, until you find a line with your own code:

    com.example.myidictionary.MySQLiteDefinitionHelper.deleteDictionary(MySQLiteDefinitionHelper.java:309)
    

That is, in MySQLiteDefinitionHelper.java, specifically in the deleteDictionary method, the code on line 309 will lead to a NullPointerException later.

public void deleteDictionary(String tblname)
{
    //SQLiteDatabase db = this.getWritableDatabase();
    //db.execSQL("DROP TABLE "+ tblname);
    //Toast.makeText(getApplicationContext(),  "View", Toast.LENGTH_SHORT).show();
    Log.d("DELETE_TABLE", tblname);
}

It seems tblname is null. And this also explains why you couldn't drop the table.

In the future please don't post large pieces of code split to multiple scrolling boxes. Read the stack trace in logcat, and post only the relevant code segment here, and post the full code in one piece on pastebin.com.

Upvotes: 1

ayon
ayon

Reputation: 2180

See my answer here. It will solve your all Database problems in Android if you put some time and know the usage.

Populating SQLite Database

Upvotes: 0

Related Questions