1

I have another error with an uri when I want to update a line, I get this error below when I use : long id = ContentUris.parseId(uri);

My error :

01-05 07:11:18.091 32144-32144/com.example.jean.cartememoire E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.jean.cartememoire, PID: 32144
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NumberFormatException: Invalid long: "Cartes_table"
at java.lang.Long.invalidLong(Long.java:124)
at java.lang.Long.parse(Long.java:363)
at java.lang.Long.parseLong(Long.java:353)
at java.lang.Long.parseLong(Long.java:321)
at android.content.ContentUris.parseId(ContentUris.java:86)
at com.example.jean.cartememoire.CardContentProvider.update(CardContentProvider.java:209)
at android.content.ContentProvider$Transport.update(ContentProvider.java:355)
at android.content.ContentResolver.update(ContentResolver.java:1362)
at com.example.jean.cartememoire.Play.setCard(Play.java:176)
at com.example.jean.cartememoire.Play.repondre(Play.java:143)
at java.lang.reflect.Method.invoke(Native Method) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616

In my ContentProvider below, I have a delete and insert function that work well, but update doesn't work. And I don't understand my error, why it is saying Invalid long: "Cartes_table" ? I matched the exact same thing in another function and it worked

My Content Provider :

public class CardContentProvider extends ContentProvider {
    private StockCard stock;

    public static String authority = "com.example.jean.cartememoire.CardContentProvider";

    public static final String _ID = "_id";
    public static final String THEME = "THEME";
    public static final String QUESTION = "QUESTION";
    public static final String REPONSE = "REPONSE";
    public static final String DIFFICULTE = "DIFFICULTE"; //# = un chiffre
    public static final String STOCK_TABLE = "Cartes_table";
    public static final String STOCK_FACILE = "Cartes_table_facile";
    public static final String STOCK_NORMAL = "Cartes_table_normal";
    public static final String STOCK_DIFFICILE = "Cartes_table_difficile";
    public static final String STOCK_EXTREME = "Cartes_table_extreme";
    public static final String STOCK_IMPOSSIBLE = "Cartes_table_impossible";


    private static final int ID_STOCK_TABLE = 1;
    public static final int ID_FACILE = 2;
    public static final int ID_NORMAL = 3;
    public static final int ID_DIFFICILE = 4;
    public static final int ID_EXTREME = 5;
    public static final int ID_IMPOSSIBLE = 6;
    private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        matcher.addURI(authority, STOCK_TABLE, ID_STOCK_TABLE);
        matcher.addURI(authority, STOCK_TABLE+"/*", ID_STOCK_TABLE);
        matcher.addURI(authority, STOCK_FACILE, ID_FACILE);
        matcher.addURI(authority, STOCK_NORMAL, ID_NORMAL);
        matcher.addURI(authority, STOCK_DIFFICILE, ID_DIFFICILE);
        matcher.addURI(authority, STOCK_EXTREME, ID_EXTREME);
        matcher.addURI(authority, STOCK_IMPOSSIBLE, ID_IMPOSSIBLE);
        matcher.addURI(authority, STOCK_FACILE+"/*", ID_FACILE);
        matcher.addURI(authority, STOCK_NORMAL+"/*", ID_NORMAL);
        matcher.addURI(authority, STOCK_DIFFICILE+"/*", ID_DIFFICILE);
        matcher.addURI(authority, STOCK_EXTREME+"/*", ID_EXTREME);
        matcher.addURI(authority, STOCK_IMPOSSIBLE+"/*", ID_IMPOSSIBLE);

    }


    @Override
    public boolean onCreate() {
        stock = StockCard.getInstance(getContext());
        return true;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = stock.getReadableDatabase();
        int code = matcher.match(uri);
        Cursor cursor;
        switch (code)
        {
            case ID_STOCK_TABLE:
                Log.d("Uri provider = "+code+" ", uri.toString()+" ");
                cursor = db.query(STOCK_TABLE, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            case ID_FACILE:
                cursor = db.query(STOCK_FACILE, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            case ID_NORMAL:
                cursor = db.query(STOCK_NORMAL, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            case ID_DIFFICILE:
                cursor = db.query(STOCK_DIFFICILE, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            case ID_EXTREME:
                cursor = db.query(STOCK_EXTREME, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            case ID_IMPOSSIBLE:
                cursor = db.query(STOCK_IMPOSSIBLE, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
            default:
                //long u = ContentUris.parseId(uri);
                Log.d("Uri provider = "+code+" ", uri.toString()+" ");
                throw new UnsupportedOperationException("Pas encore implémenté");
        }

        return cursor;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = stock.getWritableDatabase();
        int code = matcher.match(uri);
        long id;
        System.out.println(uri.toString());
        Uri.Builder builder = new Uri.Builder();

        switch(code)
        {
            case ID_STOCK_TABLE:
                id = db.insert(STOCK_TABLE, null, values);
                builder.appendPath(STOCK_TABLE);
                break;
            case ID_FACILE:
                id = db.insert(STOCK_FACILE, null, values);
                builder.appendPath(STOCK_FACILE);
                break;
            case ID_NORMAL:
                id = db.insert(STOCK_NORMAL, null, values);
                builder.appendPath(STOCK_NORMAL);
                break;
            case ID_DIFFICILE:
                id = db.insert(STOCK_DIFFICILE, null, values);
                builder.appendPath(STOCK_DIFFICILE);
                break;
            case ID_EXTREME:
                id = db.insert(STOCK_EXTREME, null, values);
                builder.appendPath(STOCK_EXTREME);
                break;
            case ID_IMPOSSIBLE:
                id = db.insert(STOCK_IMPOSSIBLE, null, values);
                builder.appendPath(STOCK_IMPOSSIBLE);
                break;
            default:
                throw new UnsupportedOperationException("Pas encore implémenté");
        }

        builder.authority(authority);
        builder = ContentUris.appendId(builder, id);

        return builder.build();
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = stock.getWritableDatabase();
        int code = matcher.match(uri);
        int i;
        long id = ContentUris.parseId(uri);
        System.out.println("URI DELETE : "+id);
        switch(code)
        {
            case ID_STOCK_TABLE:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_TABLE, "_id=" + id, null);
                break;
            case ID_FACILE:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_FACILE, "_id=" + id, null);
                break;
            case ID_NORMAL:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_NORMAL, "_id=" + id, null);
                break;
            case ID_DIFFICILE:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_DIFFICILE, "_id=" + id, null);
                break;
            case ID_EXTREME:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_EXTREME, "_id=" + id, null);
                break;
            case ID_IMPOSSIBLE:
                id = ContentUris.parseId(uri);
                i = db.delete(STOCK_IMPOSSIBLE, "_id=" + id, null);
                break;
            default:
                throw new UnsupportedOperationException("Pas encore implémenté");
        }

        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

        SQLiteDatabase db = stock.getWritableDatabase();
        int code = matcher.match(uri);
        int i;
        long id = ContentUris.parseId(uri);
        System.out.println("URI C "+id);
        switch(code)
        {
            case ID_STOCK_TABLE:
                id = ContentUris.parseId(uri);
                i = db.update(STOCK_TABLE, values, "_id=" + id, selectionArgs);
                break;
            case ID_FACILE:
                id = ContentUris.parseId(uri);
                i = db.update(STOCK_FACILE, values, "_id=" + id, selectionArgs);
                break;
            case ID_NORMAL:
                id = ContentUris.parseId(uri);
                System.out.println("ID NORMAL URI : "+id);
                i = db.update(STOCK_NORMAL, values, "_id=" + id, selectionArgs);
                break;
            case ID_DIFFICILE:
                id = ContentUris.parseId(uri);
                i = db.update(STOCK_DIFFICILE, values, "_id=" + id, selectionArgs);
                break;
            case ID_EXTREME:
                id = ContentUris.parseId(uri);
                i = db.update(STOCK_EXTREME, values, "_id=" + id, selectionArgs);
                break;
            case ID_IMPOSSIBLE:
                id = ContentUris.parseId(uri);
                i = db.update(STOCK_IMPOSSIBLE, values, "_id=" + id, selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("Pas encore implémenté");
        }

        return 0;
    }
}

And my function setCard to update my database :

public void setCard(int new_difficulty)
    {

            //Mise à jour dans cartes_table
            ContentValues cv = new ContentValues();
            cv.put(CardContentProvider.THEME, theme);
            cv.put(CardContentProvider.QUESTION, question);
            cv.put(CardContentProvider.REPONSE, reponse);
            cv.put(CardContentProvider.DIFFICULTE, new_difficulty);


            ContentResolver resolver = this.getContentResolver();
            Uri.Builder builder = new Uri.Builder();


            builder.scheme("content").authority(CardContentProvider.authority).appendPath(CardContentProvider.STOCK_TABLE);
            Uri uri = builder.build();
            System.out.println("SET CARD : "+uri.toString());
            int u = resolver.update(uri, cv, null, null);
            System.out.println("SET CARD AFTER"+u);
            long id = ContentUris.parseId(uri);
            Toast.makeText(this, "Carte créé avec succès !", Toast.LENGTH_SHORT).show();

            //Changement de decks (delete + insert)
            //addToDiffDeck(new_difficulty, cv);

    }

Thank you guys !

USER9561
  • 1,084
  • 3
  • 15
  • 41
Zul Huky
  • 331
  • 4
  • 24
  • setup a breakpoint in the first line of `update` method and debug it step-by-step – pskink Jan 05 '17 at 07:50
  • I tried to do this and I know that I have an error when I try 'long id = ContentUris.parseId(uri);', my uri is the same that when I insert a new row – Zul Huky Jan 05 '17 at 07:54
  • so what `Uri` do you want to use with `parseId`? – pskink Jan 05 '17 at 07:56
  • in my function update from my ContentProvider I want to use parseId – Zul Huky Jan 05 '17 at 07:59
  • what `Uri` are you passing to that method? – pskink Jan 05 '17 at 07:59
  • this one : `content://com.example.jean.cartememoire.CardContentProvider/Cartes_table` – Zul Huky Jan 05 '17 at 08:03
  • 1
    so what id do you want to get? docs say: *Converts the last path segment to a long. This supports a common convention for content URIs where an ID is stored in the last segment.* – pskink Jan 05 '17 at 08:03
  • I just understood why I got this error, because I get my row that I want to update from another table ! So I have a different ID... Thank you ! – Zul Huky Jan 05 '17 at 08:07

0 Answers0