Android studio,SQllite

0

Witam, mam funkcje która powinna zwracać całą tablice ale aplikacja w momencie wywołania jej wcale się nie włącza. Ktoś może widzi błąd ?
Dopiero się uczę więc proszę o wyrozumiałość :)

public ArrayList<String> getAlltitle() {

        ArrayList<String> columns = new ArrayList<String>();
        String[] temp = {"title"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("notes_contetn", temp, null, null, null, null, null);
        kursor.moveToFirst();
       int i=0;
        while (kursor.moveToNext()){

            String temp_s = new String();
        columns.add(kursor.getString(i));

        i++;
        }


        return columns;

}

a oto wywołanie jej.

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Notes_Database_Helper db1 = new Notes_Database_Helper(this);
        ListView list = (ListView) findViewById(R.id.mainViewList);
        ArrayList<String> notes = new ArrayList<String>();
        

        notes.addAll(db1.getAlltitle());  //<-----------------------------------Tutaj :)
        notes.add("to");
        notes.add("działa");
        notes.add("poprawnie");
        notes.add(getIntent().getStringExtra("new"));





            ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, notes);
            list.setAdapter(adapter);

            FloatingActionButton fab = findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intet = new Intent(MainActivity.this, Add_to_list.class);
                    startActivity(intet);
                }
            });



    }}

1
Pabloo111 napisał(a):
        String[] temp = {"title"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("notes_contetn", temp, null, null, null, null, null);
        kursor.moveToFirst();
       int i=0;
        while (kursor.moveToNext()){

            String temp_s = new String();
        columns.add(kursor.getString(i));

        i++;
        }

To co ten kod robi po kolei.

  1. Wyciąga z tabeli notes_contetn zapytanie zwracające kolumnę title.
  2. Przechodzi do pierwszego wiersza wyniku zapytania.
  3. Tworzy zmienną i z początkową wartością 0.
  4. Przechodzi do kolejnego wiersza wyniku zapytania.
  5. Jeśli wiersz z punktu 4 istnieje to, wyciąga z wiersza String w kolumnie o indeksie i.
  6. Dodaje wyciągnięty String do listy.
  7. Jeśli wiersz z punktu 4 istnieje to, zwiększa i o 1.
  8. Powrót do punktu 4.

Czy chciałeś, żeby Twój kod to robił. Dodatkowo, co może pójść źle?

  1. Może być literówka w nazwach tabel i kolumn.
  2. Wyciągana wartość za pomocą getString() może nie być Stringiem.
  3. Kolumny pod indeksem i, który jest inny dla każdego wiersza, może nie być. Co więcej, nie będzie jej na 100% już po pierwszym przejściu pętli.
  4. Zupełnie są pomijane wyniki z pierwszego, bo przesuwasz kursor na starcie na pierwszą pozycję.
  5. Kursor nie jest zamykany, co może np. spowolnić system.
0
Michał Sikora napisał(a):
Pabloo111 napisał(a):
        String[] temp = {"title"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("notes_contetn", temp, null, null, null, null, null);
        kursor.moveToFirst();
       int i=0;
        while (kursor.moveToNext()){

            String temp_s = new String();
        columns.add(kursor.getString(i));

        i++;
        }

To co ten kod robi po kolei.

  1. Wyciąga z tabeli notes_contetn zapytanie zwracające kolumnę title.
  2. Przechodzi do pierwszego wiersza wyniku zapytania.
  3. Tworzy zmienną i z początkową wartością 0.
  4. Przechodzi do kolejnego wiersza wyniku zapytania.
  5. Jeśli wiersz z punktu 4 istnieje to, wyciąga z wiersza String w kolumnie o indeksie i.
  6. Dodaje wyciągnięty String do listy.
  7. Jeśli wiersz z punktu 4 istnieje to, zwiększa i o 1.
  8. Powrót do punktu 4.

Czy chciałeś, żeby Twój kod to robił. Dodatkowo, co może pójść źle?

  1. Może być literówka w nazwach tabel i kolumn.
  2. Wyciągana wartość za pomocą getString() może nie być Stringiem.
  3. Kolumny pod indeksem i, który jest inny dla każdego wiersza, może nie być. Co więcej, nie będzie jej na 100% już po pierwszym przejściu pętli.
  4. Zupełnie są pomijane wyniki z pierwszego, bo przesuwasz kursor na starcie na pierwszą pozycję.
  5. Kursor nie jest zamykany, co może np. spowolnić system.
public  ArrayList<String> getAlltitle() {

        ArrayList<String> columns = new ArrayList<String>();
        String[] temp = {"title"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("notes_contetn", temp, null, null, null, null, null);
        kursor.moveToPosition(0);


        do {
            columns.add(kursor.getString(kursor.getColumnIndex("title")));

        }while (kursor.moveToNext());


        return columns;

    }

a teraz ? chociaż dalej nie działa ;/ nie mam pojecia dlaczego

1

Zależy co znaczy, że "nie działa". Użyj debuggera i zobacz krok po kroku, jak kod się zachowuje w metodzie getAlltitle() - https://developer.android.com/studio/debug.

0

Wygląda na to jakby nie było bazy danych hmm...

E/SQLiteLog: (1) 
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: pl.pawel.notatnikpablo, PID: 29687
    java.lang.RuntimeException: Unable to start activity ComponentInfo{pl.pawel.notatnikpablo/pl.pawel.notatnikpablo.MainActivity}: android.database.sqlite.SQLiteException: no such table: notes_contetn (Sqlite code 1 SQLITE_ERROR): , while compiling: SELECT title FROM notes_contetn, (OS error - 2:No such file or directory)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3300)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3484)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123)
        at android.os.Handler.dispatchMessage(Handler.java:109)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
     Caused by: android.database.sqlite.SQLiteException: no such table: notes_contetn (Sqlite code 1 SQLITE_ERROR): , while compiling: SELECT title FROM notes_contetn, (OS error - 2:No such file or directory)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:948)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:559)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:603)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:63)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1493)
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1335)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1206)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1374)
        at pl.pawel.notatnikpablo.Notes_Database_Helper.getAlltitle(Notes_Database_Helper.java:47)
        at pl.pawel.notatnikpablo.MainActivity.onCreate(MainActivity.java:31)
        at android.app.Activity.performCreate(Activity.java:7436)
        at android.app.Activity.performCreate(Activity.java:7426)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3279)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3484) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123) 
        at android.os.Handler.dispatchMessage(Handler.java:109) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:7470) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958) 
package pl.pawel.notatnikpablo;

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

import java.util.ArrayList;

public class Notes_Database_Helper extends SQLiteOpenHelper {


    public Notes_Database_Helper(Context context) {
        super(context, "note.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                "create table notes_table(" +
                        "id integer primary key autoincrement," +
                        "title text," +
                        "note_contetn text)" +
                        "");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void add_note(String title, String content) {

        SQLiteDatabase db = getWritableDatabase();
        ContentValues walues = new ContentValues();
        walues.put("title", title);
        walues.put("note_contetn", content);
        db.insertOrThrow("notes_table", null, walues);
    }

    public  ArrayList<String> getAlltitle() {

        ArrayList<String> columns = new ArrayList<String>();
        String[] temp = {"title"};
        SQLiteDatabase db = getReadableDatabase();
        Cursor kursor = db.query("notes_contetn", temp, null, null, null, null, null);
        kursor.moveToPosition(0);


        do {
            columns.add(kursor.getString(kursor.getColumnIndex("title")));

        }while (kursor.moveToNext());


        return columns;

    }
}

tylko dlaczego ?

1

Baza danych jest. Nie ma tabeli notes_contetn. Za to tworzysz tabelę notes_table.

0

Dziękuję bardzo za pomoc i wytrwałość, pisałem to chyba zbyt późno że tego nie zauważyłem.. Nie ważne, nauka na przyszłość jest. Jeszcze raz dzięki :)

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