Wyszukiwanie danych w bazie SQLite - Android

0

Siema
Mam aplikacje na androida z podpiętą bazą danych, i teraz prośba czy mógł by mi ktoś pomóc napisać metode która będzie wyszukiwała coś z tej bazy ? Próbowałem według 3 tutoriali ale nic nie działa.

Tutaj klasa DataBaseHelper : http://ctrlv.it/id/4607/3755908628
Klasa TestAdapter : http://pastebin.com/x3z4fjRn
i klasa university : http://pastebin.com/QGPsm7iE gdzie po kliknięciu buttona chciał bym zeby pobrało wpisany tekst z EditText wyszukało podobny w bazie i wypisał wynik w textView.
Stworzyłem jeszcze klasę BuildingItem w której tworzył bym obiekt z danymi pobranymi z bazy: http://pastebin.com/aP5csLMx
Chętnie cały projekt podesłał bym na priv.

bardzo proszę o pomoc
Pozdrawiam

0

@MiL @szweszwe
w klasie TestAdapter dwie metody, od linie 77 - 99.
w klasie university linie 55-70. metoda takeAll ( pod tą ) działa np.

0

Jakieś logi dostajesz?

0

http://imgur.com/jzF4vC0
problem z metodą onClick ? no jest podpięta w Xml za pomocą : android:onClick="ShowAllBtn" bez literówek ..

0

02-25 1448.608 308-308/? E/AudioMixer: setEqBand
02-25 1448.629 883-883/com.example.marci.parserv1 E/SQLiteLog: (1) no such column: NAME
02-25 1448.645 883-883/com.example.marci.parserv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.marci.parserv1, PID: 883
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
at android.view.View.performClick(View.java:4832)
at android.view.View$PerformClick.run(View.java:19844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5319)
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:1016)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
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:1016) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
Caused by: android.database.sqlite.SQLiteException: no such column: NAME (code 1): , while compiling: SELECT * FROM university WHERE NAME LIKE 'Large Text%'
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at com.example.marci.parserv1.TestAdapter.getResult(TestAdapter.java:80)
at com.example.marci.parserv1.University.takeOne(University.java:60)
at com.example.marci.parserv1.University.ShowAllBtn(University.java:16)
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372)

To wszystkie Errory które występują po kliknięciu w guzik

0

po prostu jestem prawie pewien że te metody w TestAdapter są źle napisane.. i już naprawde nie mam pojęcia jak to poprawić :/

0

Nie masz w ogóle takich kolumn w tej bazie - szukasz po NAME a czegoś takiego tam nie masz.

0

No poprawiłem ( literówka w DB, dzięki :)), teraz zostało już tylko to ;/
02-25 1440.206 22847-22847/? E/QCOMSysDaemon: Diag_LSM_Init failed : 0
02-25 1443.557 308-894/? E/AudioMixer: setEqBand
02-25 1443.587 22142-22142/com.example.marci.parserv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.marci.parserv1, PID: 22142
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
at android.view.View.performClick(View.java:4832)
at android.view.View$PerformClick.run(View.java:19844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5319)
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:1016)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
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:1016) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.marci.parserv1.University.takeOne(University.java:62)
at com.example.marci.parserv1.University.ShowOne(University.java:16)
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
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:1016) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
02-25 1443.598 308-890/? E/alsa_effect: snd_effect_set : AFE_PORT_ID_PRIMARY_MI2S_RX xLOUD effect setting failed
02-25 1443.599 308-890/? E/alsa_effect: snd_effect_set : AFE_PORT_ID_PRIMARY_MI2S_RX ClearPhase effect setting failed
02-25 1443.694 838-1212/? E/InputDispatcher: channel 'e9725af com.example.marci.parserv1/com.example.marci.parserv1.ViewMain (server)' ~ Channel is unrecoverably broken and will be disposed!
02-25 1445.101 838-1235/? E/WifiStateMachine: set country code PL
02-25 1446.123 23062-23062/? E/QCOMSysDaemon: Can't find/open bootselect node: (No such file or directory)
02-25 1446.124 23062-23062/? E/QCOMSysDaemon: Diag_LSM_Init failed : 0

0

Albo coś wrzuć do bazy albo w metodzie takeOne sprawdzaj czy jest coś w kursorze po selekcie i dopiero wtedy to przypisuj do zmiennych.

0

Nie jestem orłem z programowania a ma być to praca zaliczeniowa na studia ;/

0
  1. Sprawdź co przekazujesz do funkcji jako parametr, czy na podstawie tego stringa da się coś znaleźć w bazie.
  2. Kursor możesz sprawdzić tak:
if ( cursor.moveToFirst() ) {
    // uzywasz getString
} else {
    // zamiast brac z kursora ustawiasz sobie jakis domyslny tekst
}
0

A nie dał byś rady tego http://developer.android.com/training/search/search.html przerobić żeby do mojego kodu pasowało ? :(
Chodziło by mi o proste wyszukiwanie po nazwie ...Tobie pewnie to chwile zajmie a ja juz od 2 dni sie z tym męcze i bez postępów..

0

a więc po wykonaniu takiego kodu :
public Cursor getResult(String nazwa) {
Cursor cursor;

   cursor=mDb.rawQuery("SELECT * FROM university" + " WHERE "
           + "NAME"  +
           " LIKE  '"+nazwa+"%'",null);
   if ( cursor.moveToFirst() ) {
       String departments = cursor.getString(1);
       String name = cursor.getString(2);
       String addres = cursor.getString(3);
   } else {
       Log.e(TAG, "kursor pusty");
       // zamiast brac z kursora ustawiasz sobie jakis domyslny tekst
   }
   return cursor;
}

okazuje się że kursor jest pusty
Logi :
02-25 1730.559 25108-25108/com.example.marci.parserv1 E/DataAdapter: kursor pusty
02-25 1730.598 25108-25108/com.example.marci.parserv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.marci.parserv1, PID: 25108
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
at android.view.View.performClick(View.java:4832)
at android.view.View$PerformClick.run(View.java:19844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5319)
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:1016)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
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:1016) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.marci.parserv1.University.takeOne(University.java:66)
at com.example.marci.parserv1.University.ShowOne(University.java:17)
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
at android.view.View.performClick(View.java:4832) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
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:1016) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
02-25 1730.741 838-1931/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
02-25 1730.746 838-1931/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!

0

W takim razie po wykonaniu takiego kodu :
private void takeOne(){
TestAdapter mDbHelper = new TestAdapter(this);
mDbHelper.createDatabase();
mDbHelper.open();
String taskName = textView.getText().toString();

    Cursor testdata = mDbHelper.getResult(taskName);
    if ( testdata.moveToFirst() ) {
        String nazwa = testdata.getString(1);
        String wydział = testdata.getString(2);
        String adres = testdata.getString(3);
        Log.d(TAG, "Pobrano wszystkie wiersze i przypisano do zmiennych");

        textView.setText(textView.getText() + "\n" + nazwa + "\n" + wydział + "\n" + adres);
        Log.d(TAG, "Pobrano wszystkie wiersze przypisano do zmiennych I dodano do textView");}
    else {
        Log.e(TAG, "kursor pusty");
    }
        mDbHelper.close();
}

Aplikacja się nie resetuje ! i logi takie dostaje :
02-25 1702.738 308-11976/? E/AudioMixer: setEqBand
02-25 1702.750 4167-4167/com.example.marci.parserv1 E/University: kursor pusty

Wracając do Twojego pytania o to

  1. Sprawdź co przekazujesz do funkcji jako parametr, czy na podstawie tego stringa da się coś znaleźć w bazie.

To przekazuje tekst pobrany z EditText i jest to taki sam tekst jaki znajduje się w bazie w kolumnie NAME na miejscu pierwszym.

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