przechwycenie wyjątku Android sqlite

0

Cześć,

podczas próby przechwycenia wyjątku cały czas zamiast przechwycić aplikacja zostaje zamknięta.
Chcę przechwycić wyjątek kiedy podana przez użytkownika nazwa nie istnieje w bazie sqlite.

Kod z blokiem try catch:

 uczSie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               try {
                   Intent uczSie = new Intent(getApplicationContext(), Nauka.class);
                   startActivity(uczSie);
                   ZarzadcaBazy.nazwaBazy = wyborTabeli.getText().toString();
                } catch (NullPointerException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (SQLiteException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (IllegalStateException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (RuntimeException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                }
            }
        }); 

Log:

 05-05 17:27:55.853 16090-16090/com.example.user.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example.user.myapplication, PID: 16090
                                                                                java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.myapplication/com.example.user.myapplication.Nauka}: java.lang.IllegalStateException: Invalid tables
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                                    at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:135)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                                 Caused by: java.lang.IllegalStateException: Invalid tables
                                                                                    at android.database.sqlite.SQLiteDatabase.findEditTable(SQLiteDatabase.java:973)
                                                                                    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
                                                                                    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
                                                                                    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
                                                                                    at com.example.user.myapplication.ZarzadcaBazy.wypiszSlowka(ZarzadcaBazy.java:79)
                                                                                    at com.example.user.myapplication.Nauka.onCreate(Nauka.java:39)
                                                                                    at android.app.Activity.performCreate(Activity.java:5990)
                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                                    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                    at android.os.Looper.loop(Looper.java:135) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
 

Pomóżcie bo ja już nie wiem o co to chodzi...

0

Bo ten Exception leci Ci już w nowym activity, do którego wchodzisz zanim wywołasz baze danych. najpierw zrób wywołanie na bazie danych, a później przejscie

0

Zrobiłem tak jak mówisz. Teraz blok try wygląda tak:

  try {
                    ZarzadcaBazy.nazwaBazy = wyborTabeli.getText().toString();
                    Intent uczSie = new Intent(getApplicationContext(), Nauka.class);
                    startActivity(uczSie);
                } 

Niestety nic to nie zmieniło...

0

po co pobierasz context aplikacji przy intent ?
jeszcze jest oczywiście pytanie co to jest za kwiatek

 ZarzadcaBazy.nazwaBazy = wyborTabeli.getText().toString();

poka no ten kod

0

ZarzadcaBazy.nazwaBazy = wyborTabeli.getText().toString();
Ten kod pobiera tekst z EditText wyborTabeli i ustawia tę wartość w polu nazwaBazy w klasie ZarzadcaBazy.

wojciechmaciejewski napisał(a):

po co pobierasz context aplikacji przy intent ?

Skopiowałem to z jakiegoś przykładu.

Cały kod klasy wygląda tak:

package com.example.user.myapplication;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class WyborTabeliSlowek extends AppCompatActivity {

    String nazwaTabeli;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wybor_tabeli_slowek);

        TextView listaTabel = (TextView) findViewById(R.id.listaTabel);
        Button uczSie = (Button) findViewById(R.id.uczSie);
        Button bDodajNowaTabeleSlowek = (Button) findViewById(R.id.bDodajNowaTabeleSlowek);
        final EditText wyborTabeli = (EditText) findViewById(R.id.wyborTabeli);



        ZarzadcaBazy zb = new ZarzadcaBazy(this);
        try{
            final Cursor k = zb.wypiszTabele();
            while (k.moveToNext()) {
                nazwaTabeli = k.getString(0);
                listaTabel.setText(listaTabel.getText() + "\n " + nazwaTabeli);
            }
        } catch (android.database.sqlite.SQLiteException e){
            Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
        } catch (java.lang.RuntimeException e){
            Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
        }

        uczSie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    ZarzadcaBazy.nazwaBazy = wyborTabeli.getText().toString();
                    Intent uczSie = new Intent(getApplicationContext(), Nauka.class);
                    startActivity(uczSie);
                } catch (NullPointerException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (SQLiteException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (IllegalStateException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                } catch (RuntimeException e){
                    Toast.makeText(getApplicationContext(),"Brak tabel do nauki. Stwórz.", Toast.LENGTH_LONG).show();
                }
            }
        });

        bDodajNowaTabeleSlowek.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent dodajTabele = new Intent(getApplicationContext(), DodawanieTabeliSlowek.class);
                startActivity(dodajTabele);
            }
        });


    }
}


 
0

Kod klasy ZarzadcaBazy

 package com.example.user.myapplication;


        import android.content.ContentValues;
        import android.content.Context;
        import android.database.Cursor;
        import android.database.sqlite.SQLiteDatabase;
        import android.database.sqlite.SQLiteOpenHelper;


public class ZarzadcaBazy extends SQLiteOpenHelper {

    public static String nazwaBazy = null;
    public final static String nazwaTabeli = null;


    public ZarzadcaBazy (Context context){
        super(context, "slowka.db", null, 10);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                "create table nazwyTabel(" +
                        "nr integer primary key autoincrement," +
                        "nazwaTabeli text" +
                        ");"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(
                "create table nazwyTabel(" +
                        "nr integer primary key autoincrement," +
                        "nazwaTabeli text" +
                        ");"
        );
    }

    public void dodajNowaTabeleSlowek(String nazwaNowejTabeli){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL(
                "create table " + nazwaNowejTabeli + "(" +
                        "nr integer primary key autoincrement," +
                        "pl text," +
                        "ang text" +
                        ");"
        );
    }

    public void dodajSlowko(String pl, String ang) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues wartosci = new ContentValues();
        wartosci.put("pl", pl);
        wartosci.put("ang", ang);
        db.insertOrThrow(DodawanieTabeliSlowek.nazwaDodawanejTabeliSlowek, null, wartosci);
    }

    public void dodajNazweTabeli(String nazwaTabeli){
        SQLiteDatabase db = getWritableDatabase();
        ContentValues wartosci = new ContentValues();
        wartosci.put("nazwaTabeli", nazwaTabeli);
        db.insertOrThrow("nazwyTabel", null, wartosci);
    }

    public Cursor wypiszSlowka(){
        String[] kolumny={"nr","pl","ang"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query(nazwaBazy,kolumny,null,null,null,null,null);
        return kursor;
    }

    public Cursor wypiszTabele(){
        String[] kolumny={"nazwaTabeli"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("nazwyTabel",kolumny,null,null,null,null,null);
        return kursor;
    }

    public void usunSlowko(int id){
        SQLiteDatabase db = getWritableDatabase();
        String[] argumenty={""+id};
        db.delete(nazwaBazy,"nr=?", argumenty);
    }

    public void usunTabele(int id){
        SQLiteDatabase db = getWritableDatabase();
        String[] argumenty={""+id};
        db.delete("nazwyTabel","nr=?", argumenty);
    }
}
 
0

Dobra to powiedz mi jaki ty chcesz wyjątek łapać w tym fragmencie kodu z pierwszego postu. Żadne cuda się nie zadziewają, przypisujesz wartość do stringa i oczekujesz że poleci jakiś SQL Exception?

Musisz łapać ten wyjątek w nowej activity albo przed przejściem do nowej activity musisz sprawdzać czy taka tabela istnieje.

po co Ci tabela nazwyTabel? są inne sposoby żeby dostać wszystkie tabele w bazie danych niż tworzenie tabeli tabel ..... O_o

0

Co do tej tabeli to właśnie zakładałem tutaj wątek bo nie wiedziałem jak to ugryźć i obszedłem to w ten sposób bo nikt mi nie odpowiedział.

Powiedz proszę jak mogę wypisać nazwy tabel w activity...

0
Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
0

Poradziłem sobie z tym, dzięki ziom!

Teraz chcę dodać kolumnę do tabeli typu integer. Chcę żeby na początku miała ona wartość 0 a później przy każdym wywołaniu odpowiedniej metody zwiększała się o 1.

  1. Jak sprawić żeby podczas dodawania rekordu wartość w kolumnie pkt była ustawiania na 0?
  2. Jaką metodą można zwiększyć wartość rekordu w kolumnie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1