1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Datenbank column existiert angeblich nicht

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Micka, 04.01.2012.

  1. Micka, 04.01.2012 #1
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Hey,

    ich bin gerade dabei ein Haushaltsbuch zu schreiben.

    In meiner StartseiteActivity will ich dazu zu Testzwecken einen Eintrag in eine Datenbank machen. Dies hab ich mir gedacht kann ich in der onCreate Methode machen. Wenn es einmal geklappt hat kommt der Source Code für den manuellen Eintrag dort wieder raus.



    Hier mein Quellcode:
    Code:
    package micka.haushaltsbuch;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    
    public class Startseiteactivity extends Activity {
       [B] final static String MY_DB_NAME = "FinanzenDB";
        final static String MY_DB_TABLE = "eintraege";[/B]
        final static String tag="ensacom"; 
        
        /** Called when the activity is first created. */
        @Override
        [B]public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SQLiteDatabase myDB = null;
            try {
                myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
                myDB.execSQL("CREATE TABLE IF NOT EXISTS tabellen"
                        + " (_id integer primary key autoincrement,"
                        + " tabellenname text not null)"
                        + ";");
                myDB.execSQL("INSERT INTO tabellen (tabellenname) "
                        +"VALUES('eintraege');");
            } finally {
                 if (myDB != null)
                      myDB.close();
            }
            onCreateDBAndDBTabled();
            setContentView(R.layout.startseitelayout);
        }[/B]
    
        /** Erzeugt Menüeintrag beenden **/
        public static final int beenden_ID = Menu.FIRST;
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            menu.add(0, beenden_ID, Menu.NONE, "beenden");
            return super.onCreateOptionsMenu(menu);
        }
        public boolean onOptionsItemSelected(MenuItem item)
        {
            switch(item.getItemId())
            {
            case beenden_ID: 
                finish();
    
            default:
                return super.onOptionsItemSelected(item);
            }
        }
        //ButtonFunktionen
        public void onClickEintragHinzufuegen(final View sfNormal) 
        {
            final Intent i = new Intent(this, EintragHinzufuegenActivity.class);
            startActivity(i);
        }
        public void onClickEintraegeAnzeigen(final View sfNormal) 
        {
            final Intent i = new Intent(this, TabellenAnzeigenActivity.class);
            startActivity(i);
        }
        /** Datenbank und Tabellen erstellen wenn noch nicht vorhanden */
        private void onCreateDBAndDBTabled()
        {
            SQLiteDatabase myDB = null;
            try {
                myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
                myDB.execSQL("CREATE TABLE IF NOT EXISTS " + MY_DB_TABLE
                        + " (_id integer primary key autoincrement,"
                        + " day integer(2), month integer(2),"
                        + " year integer(4), wofuer text not null,"
                        + " betrag real)"
                        +";");
            } finally {
                 if (myDB != null)
                      myDB.close();
            }
        }
    }
    
    In meiner onCreate Methode öffne oder erstelle ich meine Datenbank tabellen mit den Attributen _id und tabellenname.
    Direkt danach will ich einen Eintrag machen. Dabei kommen Exceptions

    hier mein LogCat:
     
  2. swordi, 04.01.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hmm die tabelle wird nur genau einmal erzeugt. wenn du später dann eine spalte im code hinzufügst, musst du die app komplett neu installieren, damit das möglich ist ( oder eben die tabelle über ein alter table statement erweitern)

    ist nur ne vermutung, dass das dein problem ist.
     
  3. Micka, 04.01.2012 #3
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    vielleicht ist es interessant die Struktur vom Rest der App zu kennen. Es gibt eine Activity zum hinzufügen von Einträgen die funktioniert auch soweit. Die einträge werden dann in eine beliebige anzugebene Tabelle der Datenbank eingetragen.
    zum testen habe ich die tabelle "eintraege" der Datenbank "FinanzenDB" gewählt.

    Wenn ich nun die Einträge anzeigen will will ich das der User erstmal eine Auswahl der existierenden Tabellen gezeigt kriegt und sich dann für eine Tabelle entscheidet. Die Methode zum anlegen neuer Tabellen habe ich noch nicht implementiert.

    Deshalb möchte ich testweise diese eine tabelle "eintraege" in die Datenbank eintragen. Später wird es eine eigene Activity geben bzw in einem headerLayout oberhalb der angezeigten Tabellen soll es die Möglichkeit geben eine neue Tabelle anzulegen wenn keine der existierenden gewünscht ist.
     
  4. Micka, 04.01.2012 #4
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    @ Swordi

    Die Tabelle tabellen soll nur diese eine Spalte haben und auch nie erweitert werden. Sinn ist es nur hier die Strings MY_DB_TABLE auszulagern damit man später in einer anderen Activity auf alle existierenden tabellen zugreifen kann.
     
  5. swordi, 04.01.2012 #5
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hast versucht mal die app zu deinstallieren und nochmal zu installieren?

    dann musst du ins detail rein debuggen. sonst wirds wohl schwer.

    btw: pms helfen nicht dabei schneller eine antwort zu bekommen :)
     
    Micka bedankt sich.
  6. Micka, 04.01.2012 #6
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    wird die App nicht jedesmal von Eclipse neu installiert?
     
  7. Micka, 04.01.2012 #7
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    cool danke....nun ist der Fehler weg.
     
  8. swordi, 04.01.2012 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    die app wird von eclipse nur upgedated nicht komplett neu installiert.

    danke button befindet sich rechts unten
     
    Micka bedankt sich.
  9. Fr4gg0r, 04.01.2012 #9
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    n schönen "no such column" fehler hab ich momentan auch...
    Scheint aber eine Eigenheit der Contacts db zu sein..

    folgender Code

    Code:
    ContentResolver resolver = context.getContentResolver();
    Uri uri = ContactsContract.StatusUpdates.CONTENT_URI;
    String[] columns = new String[]{ ContactsContract.StatusUpdates.STATUS };
    String where = ContactsContract.StatusUpdates.IM_HANDLE+"=?";
    Cursor lastStatus = resolver.query(uri, columns, where, new String[]{clickedContact}, null);     
    führt zu dieser Meldung..
    01-04 20:59:31.092: E/AndroidRuntime(10619): Caused by: android.database.sqlite.SQLiteException: no such column: im_handle: , while compiling: SELECT status FROM view_data data LEFT OUTER JOIN status_updates ON (status_updates.status_update_data_id=data._id) WHERE ((im_handle=?))

    Ändere ich die Projektion, läufts :sleep:

    Code:
     
    String[] columns = new String[]{ ContactsContract.StatusUpdates.PRESENCE };
    
    Dabei sollte doch alleine die Uri bestimmen, welche Tabelle abgefragt wird..
    Laut ContactsContract.StatusUpdates | Android Developers müsste das doch funktionieren. :s

    Muss wohl eine "Optimierung" sein..
    Mit
    Code:
    String[] columns = new String[]{ ContactsContract.StatusUpdates.PRESENCE, ContactsContract.StatusUpdates.STATUS };
    gehts natürlich. :D
     
    Zuletzt bearbeitet: 04.01.2012

Diese Seite empfehlen