3 Stimmen

Fehlersuche im SimpleCursorAdapter

Ich arbeite an meiner ersten Android-App und kann nicht herausfinden, wie ich meine SimpleCursorAdpater um die Ansicht zu füllen. Der Cursor, den ich in übergeben hat Ergebnisse in es, so dass das Problem irgendwo in der Instanziierung des Adapters oder in der Bindung es an die Ansicht sein muss. Ich bin irgendwie am Ende meiner Weisheit, da keine Ausnahmen ausgelöst werden und ich kann nicht wirklich Schritt in setListAdapter.

So bekomme ich meinen Cursor überhaupt erst:

    Searches searches = new Searches(this);

    SQLiteDatabase db = searches.getReadableDatabase();
    //select _id, Name, Search FROM Searches;
    Cursor c = db.query(
                SearchConstants.TABLE_NAME, 
                FROM, null, null, null, 
                null, null);
    startManagingCursor(c);

Und das ist das Schema für meine Datenbank:

CREATE TABLE Searches (_id INTEGER PRIMARY KEY, Name Text, Search TEXT)

Hier sind die beiden Zeilen, in denen die Dinge beginnen, auseinanderzufallen:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.search, cursor, FROM, TO);
setListAdapter(adapter);

Mein Hauptlayout sieht wie folgt aus:

<ListView
    android:id="@android:id/android:list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@android:id/android:empty"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/empty" />

Hier ist die Ansicht, die mit jedem Ergebnis zu füllen ist:

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:padding="10sp">
  <TextView
    android:id="@+id/_id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
  <TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
  <TextView
    android:id="@+id/colon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=": "
    android:layout_toRightOf="@id/name" />
  <TextView
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:textStyle="italic"
    android:layout_toRightOf="@id/colon" />
</RelativeLayout>

Schließlich sind hier die statischen Variablen, die ich verwendet habe:

//search query stuff
private static String[] FROM = {SearchConstants._ID, SearchConstants.NAME_COLUMN, SearchConstants.SEARCH_COLUMN};

//where to paste search results
private static int[] TO = {R.id._id, R.id.name, R.id.search};

/**
 * Table name
 */
public static final String TABLE_NAME = "Searches";

/**
 * Name Column
 */
public static final String NAME_COLUMN = "Name";

/**
 * Search Column
 */
public static final String SEARCH_COLUMN = "Search";

Ich denke, das ist der gesamte relevante Code. Ich habe keine Ahnung, wie man an dieser Stelle fortfahren, so dass alle Vorschläge überhaupt hilfreich sein würde.

Danke! Brian

PS: Sieht so aus, als gäbe es hier eine Menge toller Vorschläge - ich ignoriere sie nicht, ich hatte nur noch nicht die Gelegenheit dazu. Danke für die Ratschläge! Irgendwann werde ich sie alle durchgehen und versuchen, ein Feedback dazu zu geben, welche Dinge für mich gut funktioniert haben.

0voto

Emile Punkte 11106

Es sieht nicht so aus, als hätten Sie etwas falsch gemacht. Sie haben allerdings nicht Ihren gesamten Code gezeigt, so dass es schwierig sein könnte, etwaige Fehler zu erkennen.

Ich bin nicht sicher, ob die Zeile startManagingCursor(c) dies für Sie tut, aber in meinen Beispielen habe ich die folgenden Zeilen, nachdem meine Abfrage abgeschlossen ist. Da Ihr Beispiel absolut gut aussieht, könnte es sein, dass Ihr Cursor auf das erste Element zurückgesetzt werden muss.

(Ah, ich habe gerade bemerkt, dass kichik darauf hingewiesen hat, aber ich lasse mein Beispiel stehen).

if (c != null) {
        c.moveToFirst();
    }

Meine Abfragen sehen oft so aus:

public Cursor getQueryCursor() 
    {
     Cursor c;
     c = null;
     try{
         c =  myDataBase.query(TABLE_MYTABLE, new String[] {
          COLUMN_ID,COLUMN_LABEL, COLUMN_TEXT}, 
                null, 
                null, 
                null, 
                null, 
                null);

         if (c != null) {
             c.moveToFirst();
         }

     }catch(Exception ec)
     {
      Log.w("MY_APP", ec.getMessage());

     }
     return c;
    }

Dann, wenn Sie Ihr Abfrageergebnis anwenden, setze ich auch oft try/catch-Anweisungen um sie herum und füge Unterbrechungspunkte an diesen Punkten hinzu (manchmal gibt die getMessage() null zurück, aber andere Eigenschaften der Ausnahme werden das Problem hervorheben. Ich überprüfe auch die Ausgabe von LogCat. Oft konnte ich die Ursache meiner Probleme mit dem Folgenden herausfinden.

try{
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.search, cursor, FROM, TO);
    setListAdapter(adapter);
}catch(IllegalStateException e)
{
    Log.w("MyApp", e.getMessage());
}catch(Exception es)
{
    Log.w("MyApp", es.getMessage());
}

0voto

Qamar Punkte 1

Bitte überprüfen Sie Ihre SQLite-Datenbank, sie muss eine Spalte '_id' als Primärschlüssel haben. Ich hatte die gleiche Art von Problem, und schließlich herausfinden, es mit diesem...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X