Android SQLLite Fehler

E

Elbern

Neues Mitglied
0
Guten Tag,

mit @Jaiel Hilfe habe ich mir nun etwas zusammen gebastelt, leider kommt immer ein Fehler:
Code:
  Caused by: android.database.sqlite.SQLiteException: no such table: budget_list (code 1): , while compiling: SELECT id, datum, type, beschreibung, summe FROM budget_list WHERE id=-1

Hier meine DbHelper Klasse:
PHP:
public class DbHelper extends SQLiteOpenHelper {

    //Datenbankname und Version
    public static final String DB_NAME = "budget.db";
    public static final int DB_VERSION = 1;
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_SUMME = "summe";
    public static final String COLUMN_DATE = "datum";
    public static final String COLUMN_BESCHREIBUNG = "beschreibung";
    public static final String COLUMN_TYPE = "type";

    //Tabellenname
    public static final String TABLE_BUDGET_LIST = "budget_list";

    //hier wird das CREATE TABLE Statement in einem String gespeichert um es später auszuführen
    public static final String SQL_CREATE = "CREATE TABLE " + TABLE_BUDGET_LIST +
            "(" +COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
            COLUMN_DATE+" STRING NOT NULL, " + COLUMN_TYPE + " int , " + COLUMN_BESCHREIBUNG + " TEXT NOT NULL, "+ COLUMN_SUMME +" DOUBLE NOT NULL"+ " );";

    public DbHelper(Context context){
        super (context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE);
    }

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

    }
}

Hier die DataBaseSource:
PHP:
private static final String LOG_TAG = DataBaseSource.class.getSimpleName();

    private SQLiteDatabase database;
    private DbHelper dbHelper;

    private String[] columns = {
            dbHelper.COLUMN_ID,
            dbHelper.COLUMN_DATE,
            dbHelper.COLUMN_TYPE,
            dbHelper.COLUMN_BESCHREIBUNG,
            dbHelper.COLUMN_SUMME
    };

    public DataBaseSource(Context context) {

        dbHelper = new DbHelper(context);
    }

    public boolean open() {
        try{
            database = dbHelper.getWritableDatabase();
            return true;
        }
        catch (SQLiteException e){
            e.printStackTrace();
        }
        return false;
    }

    public void close() {
        dbHelper.close();

    }

    public BudgetItem insertBudgetItemToDB(String date, int type, String beschreibung, double summe) {
        if(!database.isOpen())
            return null;

        ContentValues values = new ContentValues();
        values.put(DbHelper.COLUMN_DATE, date);
        values.put(DbHelper.COLUMN_TYPE, type);
        values.put(DbHelper.COLUMN_BESCHREIBUNG, beschreibung);
        values.put(DbHelper.COLUMN_SUMME, summe);


        Cursor cursor = database.query(DbHelper.TABLE_BUDGET_LIST,
                columns, DbHelper.COLUMN_ID + "=" +
                        database.insert(DbHelper.TABLE_BUDGET_LIST, null, values),
                null, null, null, null);

        if(cursor==null||!cursor.moveToFirst())
            return null;

        BudgetItem bItem= cursorToBudgetItem (cursor);

        cursor.close();

        return bItem;
    }

    private BudgetItem cursorToBudgetItem(Cursor cursor) {
        BudgetItem tmpBI=null;
        try{
            tmpBI = new BudgetItem(
                    cursor.getInt(cursor.getColumnIndexOrThrow(DbHelper.COLUMN_ID)),
                    cursor.getString(cursor.getColumnIndexOrThrow(DbHelper.COLUMN_DATE)),
                    cursor.getDouble(cursor.getColumnIndexOrThrow(DbHelper.COLUMN_SUMME)),
                    cursor.getInt(cursor.getColumnIndexOrThrow(DbHelper.COLUMN_TYPE)),
                    cursor.getString(cursor.getColumnIndexOrThrow(DbHelper.COLUMN_BESCHREIBUNG)));}
        catch(IllegalArgumentException e){
            e.printStackTrace();
        }
        return tmpBI;
    }

    public List<BudgetItem> getAllBudgetItemsFromDB() {
        List<BudgetItem> bItemList = new ArrayList<>();

        Cursor cursor = database.query(DbHelper.TABLE_BUDGET_LIST,
                columns, null, null, null, null, null);

        if(cursor==null||!cursor.moveToFirst())
            return null;

        while(!cursor.isAfterLast()) {
            bItemList.add(cursorToBudgetItem(cursor));
            if(!cursor.moveToNext())
                return null;
        }

        cursor.close();

        return bItemList;
    }

Und hier möchte ich einen Eintrag hinzufügen:
PHP:
DataBaseSource db = new DataBaseSource(getApplicationContext());
        if(!db.open())
            return;
        db.insertBudgetItemToDB(datum, 0, beschreibung, Double.valueOf(new_guthaben));
        db.close();

Ich weiß nicht, wieso das nicht funktionieren will?!

mfg
Elbern
 
Hallo Elbern,

der Fehler sagt ja schon , dass in der DB keine Tabelle mit dem namen
budget_list nicht vorhanden ist.

Ergo ist sie nicht erstellt worden .

Hast du denn auch eine vernünftige Initalisierung der DB gemacht wird die datenbank überhaupt angelegt ???
 
  • Danke
Reaktionen: Elbern und 123thomas
Hallo,

die Fehlermeldung sagt ja, dass die Tabelle buget_list nicht vorhanden ist.

So wie ich das sehe wird das OnCreate zum erstellen der "Tabelle" nicht aufgerufen.

EDIT: swa00 war schon wieder schneller:-( :)

MODEDIT 2 : Zack Zack - gib Gas :)
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: Elbern und swa00
So wie ich das sehe wird das Oncreate zum erstellen der "Tabelle" nicht aufgerufen.

Yupp, ich frage mich aber auch warum nicht , denn er macht im Helper ein
@override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE);
}
 
  • Danke
Reaktionen: Elbern
Könnte es daran liege, das ich nur per Android Studio über meinen Handy debuggen lasse, muss ich es vielleicht erst komplett erstellen?
 
nee musst du nicht,
Also , wird deine DB budget.db erstellt oder nicht ???
Haste Schreibrechte, Permissions, Manifest gesetzt ??
 
Stimmt ich habe noch keine Berechtigungen erstellt, aber würde dann nicht ein anderer Fehler kommen.
Was meinst du mit Manifest?
 
öhm, READ/WRITE EXTERNAL_STORAGE ?
und dann noch zur Probe manuell die Rechte der App auf dem Smartphone vergeben , wenn es >= M ist
 
  • Danke
Reaktionen: Elbern
Hab jetzt folgende Permissions hinzugefügt, leider immer noch der selbe Fehler :confused2:

Code:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
und nochmal die Frage : wird deine DB - Datei erstellt ?

Welches Android-System hat dein Smartphone ?
 
  • Danke
Reaktionen: Elbern
Ich kann den App Ordner überhaupt nicht finden, er sollte doch in Android/data liegen?
 
Du kannst auch
Code:
 public static final String DB_NAME = "budget.db";

Code:
File appDir = con.getExternalFilesDir(null);
public static String DB_NAME = appDir.toString() +  "/budget.db";

Ändern , dann ist sie unter
Android/data/deinpackage/files


Könntest du mir bitte jetzt endlich mal mitteilen , welches Betriebssystem du hast ( ich frage zum dritten male)
 
  • Danke
Reaktionen: Elbern
Android 6.0.1 Sorry
 
Hast du auch Deiner App MANUELL die Schreibberechtigungen gegeben - also analog mit dem Finger :)
 
  • Danke
Reaktionen: Elbern
Ja hab ich auch versucht, es wird keine DB-Datei erstellt.
Ich kann nicht verstehen wieso :cursing:

Hier mal der komplette Errorstack:

Code:
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.shahin.shahin, PID: 20516
                  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:5697)
                      at android.widget.TextView.performClick(TextView.java:10826)
                      at android.view.View$PerformClick.run(View.java:22526)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   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:5697) 
                      at android.widget.TextView.performClick(TextView.java:10826) 
                      at android.view.View$PerformClick.run(View.java:22526) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                   Caused by: android.database.sqlite.SQLiteException: no such table: budget_list (code 1): , while compiling: SELECT id, datum, type, beschreibung, summe FROM budget_list WHERE id=-1
                  #################################################################
                  Error Code : 1 (SQLITE_ERROR)
                  Caused By : SQL(query) error or missing database.
                      (no such table: budget_list (code 1): , while compiling: SELECT id, datum, type, beschreibung, summe FROM budget_list WHERE id=-1)
                  #################################################################
                      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1058)
                      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623)
                      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
                      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:1454)
                      at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1301)
                      at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1172)
                      at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1340)
                      at com.example.shahin.shahin.DataBaseSource.insertBudgetItemToDB(DataBaseSource.java:63)
                      at com.example.shahin.shahin.addieren.clickHinzu(addieren.java:55)
                          ... 12 more
 
a) Kopier dir mal das hier und setze es irgendwo rein

Code:
//////////////////////////////////////////////////////////////////////////////
  public static class Settings implements BaseColumns
  {
    public static final String TABLE_NAME   = "settings";
    public static final String COLUMN_NAME  = "name";
    public static final String COLUMN_VALUE = "value";


    public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " +
            TABLE_NAME + " (" +
            _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_VALUE + " TEXT " + ")";

  }
  //////////////////////////////////////////////////////////////////////////////
  public class SDBSQLiteHelper extends SQLiteOpenHelper
  {

    private static final int DATABASE_VERSION = 4;


    public SDBSQLiteHelper(Context context, String db)
    {

      super(context, db, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase)
    {
      sqLiteDatabase.execSQL(Settings.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
    {
      //sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + Settings.TABLE_NAME);
      onCreate(sqLiteDatabase);
    }
  }

///////////////////////////////////////////////////////////////
private void _int_putValue(String key, String val)
{
  File appDir = mContext.getExternalFilesDir(null);
  SQLiteDatabase database = new SDBSQLiteHelper(mContext,appDir.toString()+ "/app_settings.db").getWritableDatabase();
 
  ContentValues values = new ContentValues();
  values.put(Settings.COLUMN_NAME , key);
  values.put(Settings.COLUMN_VALUE, val);

  int id = -1;
  Cursor c = database.rawQuery("SELECT * FROM  settings  where name = '" + key + "'", null);
  if (c.moveToFirst()) id = c.getInt(c.getColumnIndex("_id"));


  if(id==-1)
    database.insert(Settings.TABLE_NAME, null, values);
  else
    database.update(Settings.TABLE_NAME, values, "_id=?", new String[]{Integer.toString(id)});
  database.close();

}

b) und dann rufst du das Ganze mal mit


Code:
 _int_putValue("MEINKEY","MEINWERT");

auf

Schau mal dann , ob irgendwas geschrieben wird
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Elbern
Es kommt kein Fehler, aber es wird auch nichts erstellt. Die Methode "_int_putValue" wird aber auf jedenfalls aufgerufen!
Aber wieso wird einfach nicht erstellt :cursing::cursing:
 
Bist du dir sicher , dass nichts erstellt wird ??
Das glaube ich schon fast gar nicht , weil alles durchläuft

Kann es sein , dass du mit deinem Filemanager am falschen platz suchts ???
Lass dir doch mal ausgeben was
appDir.toString() dir ausgibt -> da ist auch deine DB (app_settings.db)
 
  • Danke
Reaktionen: Elbern
/storage/emulated/0/Adroid/data

Aber den Ordner finde ich nirgends auf dem Handy?
 
/storage/emulated/0/Adroid/data

Das kann nicht sein , dass du das ausgeben bekommst - NIEMALS
getExternalFilesDir(null); gibt dir IMMER data/files am ende an ..

Kann es sein , dass du kein Standard Smartphone/ROM einsetzt ?
Hast du mal ein Emulator-Device ausgetestet ?
 
  • Danke
Reaktionen: Elbern

Ähnliche Themen

M
Antworten
4
Aufrufe
1.173
swa00
swa00
5
Antworten
0
Aufrufe
1.146
586920
5
B
Antworten
4
Aufrufe
489
bb321
B
Zurück
Oben Unten