Search code examples
androiddatabasesqlitecursor

SQLite database Cursor error when updating a row


I have a database table which has a column with the name "notes". This column's data get only "yes" or "no" depending if the specific row is my favorite or not (add to favorites).

I am trying to update this column's data with the following code:

public void updateFavorite(long id) 
   {
       String txt;
       System.out.println("first");
       Cursor c = database.query("recipes", null, "_id=" + id, null, null, null, null);
       c.moveToFirst();
       System.out.println("second");
       int notesIndex = c.getColumnIndex("notes");
       System.out.println("third");
       String fav=c.getString(notesIndex);
       System.out.println("fourth");

       System.out.println(fav);

       if (fav=="yes") {txt="no";}
       else {txt="yes";}

       ContentValues editEsoda = new ContentValues();

       editEsoda.put("notes", txt);

       open(); // open the database
       database.update("recipes", editEsoda, "_id=" + id, null);
       close(); // close the database
       c.close();
   } 

I am getting an error when trying to retrieve the Cursor c:

Cursor c = database.query("recipes", null, "_id=" + id, null, null, null, null);

I want to read the string at this row and column. If it is "yes" then turn it to "no". Otherwise if it is "no" then turn it to "yes".

Why am i getting an error there? Thank you in advance

This is my LogCat:

11-26 19:00:25.404: D/dalvikvm(30378): GC_FOR_MALLOC freed 4678 objects / 265896 bytes in 79ms
11-26 19:00:25.444: I/System.out(30378): first
11-26 19:00:25.444: D/AndroidRuntime(30378): Shutting down VM
11-26 19:00:25.444: W/dalvikvm(30378): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
11-26 19:00:25.454: E/AndroidRuntime(30378): FATAL EXCEPTION: main
11-26 19:00:25.454: E/AndroidRuntime(30378): java.lang.IllegalStateException: Could not execute method of the activity
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.view.View$1.onClick(View.java:2072)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.view.View.performClick(View.java:2408)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.view.View$PerformClick.run(View.java:8816)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.os.Handler.handleCallback(Handler.java:587)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.os.Looper.loop(Looper.java:123)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.app.ActivityThread.main(ActivityThread.java:4627)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at java.lang.reflect.Method.invokeNative(Native Method)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at java.lang.reflect.Method.invoke(Method.java:521)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at dalvik.system.NativeStart.main(Native Method)
11-26 19:00:25.454: E/AndroidRuntime(30378): Caused by: java.lang.reflect.InvocationTargetException
11-26 19:00:25.454: E/AndroidRuntime(30378):    at development.nk.cretanrecipes.ViewRecipes.favorite(ViewRecipes.java:235)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at java.lang.reflect.Method.invokeNative(Native Method)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at java.lang.reflect.Method.invoke(Method.java:521)
11-26 19:00:25.454: E/AndroidRuntime(30378):    at android.view.View$1.onClick(View.java:2067)
11-26 19:00:25.454: E/AndroidRuntime(30378):    ... 11 more
11-26 19:00:25.454: E/AndroidRuntime(30378): Caused by: java.lang.NullPointerException
11-26 19:00:25.454: E/AndroidRuntime(30378):    at development.nk.cretanrecipes.DatabaseConnector.updateFavorite(DatabaseConnector.java:93)
11-26 19:00:25.454: E/AndroidRuntime(30378):    ... 15 more
11-26 19:00:29.094: I/Process(30378): Sending signal. PID: 30378 SIG: 9

Solution

  • I am getting an error when trying to retrieve the Cursor c
    Cursor c = database.query("recipes", null, "_id=" + id, null, null, null, null);

    That means the database is null, you need to use database = helper.getWritableDatabase() before this line and replace helper with your SQLiteOpenHelper variable. I'm guessing this is what open() does.

    Along with what the others have said lets make this method a little faster:

    public void updateFavorite(long id) 
    {
        open(); // open the database here!
        ContentValues editEsoda = new ContentValues();
    
        // Only fetch the columns that you are going to work with
        Cursor c = database.query("recipes", new String[] {"notes"}, "_id=" + id, null, null, null, null);
    
        // If a row exists with the given id
        if(c.moveToFirst()) {
            // Toggle the value of "notes", but this should be a boolean
            if(c.getString(0).equals("yes")
                editEsoda.put("notes", "no");
            else
                editEsoda.put("notes", "yes");
    
            c.close();
            database.update("recipes", editEsoda, "_id=" + id, null);
        }
        else {
            // No data has this id
        }
        close(); // close the database
    }