Fehler beim Lesen der Zeile 0, Spalte 0 von einem CursorWindow hat 0 Zeilen, 64 Spalten

Ich irgendwann diese Fehlermeldung in meinem logcat.

Fehler beim Lesen der Zeile 0, Spalte 0 von einem CursorWindow hat 0 Zeilen, 64 Spalten.

Zuerst ein wenig Hintergrundgeschichte. Ich habe eine app, die läuft auf vielen Geräten in unserer organisation. Vor allem, es läuft derzeit auf etwa 20 x Samsung Note 8 Geräte, 2 x Samsung Note 10.1 Geräte und noch ein paar andere. So weit, das problem ist nur passiert auf 2 der Anmerkung 8-Geräte. Auf allen anderen Geräten scheint es zu funktionieren nur fine.

Wie die app funktioniert, ist, dass Benutzer die app verwenden, um Informationen zu sammeln, Texte, Fotos, Signatur etc... und all dies wird dann gespeichert/eingefügt in die SQLite-Datenbank, die als eine Zeile in den Stellungnahmen Tabelle. Die Einsendungen Tabelle mit 64 Spalten bieten für jedes Feld gesammelt werden. Es ist ein sync-Methode, die immer laufen (es ist ein AsyncTask, der ausgeführt wird, innerhalb eines runnable thread, also selbst wenn die app geschlossen ist, ist es immer noch synchronisiert die Daten im hintergrund, es sei denn, Sie streichen, schließen Sie es aus dem android task-manager), synchronisiert die Daten an einen remote-server und prüft jede 10 Sekunden, wenn eine Synchronisierung erforderlich ist, zum Beispiel, wenn Sie eine neue Vorlage eingefügt wurde, es wird dann starten Sie die Synchronisierung, die Unterwerfung. Wenn eine Vorlage ist fertig, die Synchronisierung mit dem server und erhält eine Erfolgs-Antwort, ist es dann vom Gerät gelöscht, die Datenbank. Bislang hat es funktioniert bestens und tausenden von Einsendungen wurden erfolgreich synchronisiert, etc. aber hin und wieder bekomme ich diesen einen Fehler von ein oder zwei bestimmte Note 8 tablets, die dieses problem reproduzieren. Ich habe viele Male versucht neu zu erstellen, die Fehlermeldung aber es funktioniert immer wenn ich es Teste und ich haben versucht, jede Art von Szenario, um es zu testen.

Mein code ist in tausenden von Zeilen, so werde ich versuchen, es so aktuell wie möglich. Zuerst, hier ist der relevante code für das runnable:

public Runnable myRunnable = new Runnable()
 {

    @Override
    public void run()
    { 
       count ++;
                if(count >= 10)
                {
                    android.util.Log.w("     SYNC     ", "---------------");
                    android.util.Log.w("     SYNC     ", "Checking if sync method is busy");
                    if(!syncBusy)
                    {
                        android.util.Log.w("     SYNC     ", "Sync method OPEN");
                        doSync();//This will start doing sync.
                        count = 0;
                    }
                    else
                    {
                    android.util.Log.w("     SYNC     ", "Sync method BUSY, will try again in 10 seconds");
                    android.util.Log.w("     SYNC     ", "---------------");
                    }
                }
                if(count == 1 && !syncBusy)
                {
                    checkSubmissionsLefttoSync();
                }
       mHandler.postDelayed(myRunnable, 1000);
    }
};

Dann, die doSync () - Methode ist, wo ich den upload und auch, wo bekomme ich die Fehlermeldung. Es ist über tausend Zeilen lang, so dass ich nicht wirklich wollen, poste den code hier. Was ich sagen kann ist, dass es funktioniert 100% für alle Geräte, außer den ein oder zwei Ausnahmen, die produzieren den oben genannten Fehler.

Auch, ich poste den Teil, wo ich tatsächlich Durchlaufen die Datenbank in den sync-Methode:

        databaseHelper = new Handler_Database(this);
        Cursor cursor2 = databaseHelper.getAllUnsyncedSubmissions();

        if(cursor2.getCount() > 0) 
        {
            if(cursor2.moveToFirst())
            {

              do
                {
                    try
                    {
                       //doing lookups here and populating sync arrays
                    }
                    catch (IllegalStateException e)
                    {
                        //Do Nothing
                    }
                    catch (NullPointerException e)
                    {
                        //Do Nothing
                    }
                }
                while(cursor2.moveToNext());

            }
            else
            {

            }
        }
        else
        {

        }
         cursor2.close();
         databaseHelper.close();

Habe ich bemerkt, etwas anderes, und ich bin nicht sicher, ob es ein problem ist jedoch, wenn ich die app starte, logcat-Ausgänge die folgende Zeile etwa 6 oder 7 mal:

12:48:11.115 7416 #7416 DEBUG SQLiteOpenHelper DB-version : 60

Habe ich meine eigene Warnung-Nachrichten, wenn die app startet, und diejenigen, die nur einmal angezeigt. Aber die db-version und andere Informationen, die geschrieben wird mehrere Male, um die logcat. Ist das ein problem ? Heißt das, dass meine Datenbank hat irgendeine Art von Fehler, die es erstellt mehrere Instanzen ?

Alle apps sind aktualisiert mit der signierten apk ' s aus dem playstore. Meine Datenbank onUpgrade-Methode sieht wie folgt aus:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SUBMISSIONS);

    // Create tables again
    onCreate(db);
}

Dies funktioniert gut für alle anderen tablets und Geräte. Sie alle Updates automatisch aus dem playstore und weiter zu arbeiten, wie Sie sollten. Aber warum ist die logcat Ausgabe die Zeilen mehrere Male ?

Könnte dies Teil des Problems, warum bin ich immer der Fehler wie erwähnt am Anfang von diesem post ?

Jede mögliche Einsicht wäre gerne geschätzt. Ich habe mein Haar ziehen seit Wochen und finde keine Fehler in meinem code.

UPDATE 1:

Ich sah nur diese Warnung:

08:30:58.710 16745 #16745 WARNEN CursorWindow Fenster voll ist: angeforderte 307333 bytes, free space 249426 bytes, die Größe der Fenster 2097152 bytes

Ich denke, dass dies vielleicht die Ursache meiner Probleme. Irgendwelche Ideen auf, wie man dieses Problem lösen effizient ?

UPDATE 2:

Ich denke, eine Lösung könnte sein, die Anzahl der Spalten begrenzen, dass ich wieder mit dem cursor. E. g., all die kleinen text-Werte/Spalten. Danach erstellen Sie eine neue Abfrage für jede der Spalten, die ich kenne, dauert zu viel Platz. Denkst du dies ist eine Lösung ? Wer ?

UPDATE 3:

Dies funktionieren könnte, ich denke ich werde die großen Felder in separaten Cursor nach dem anfänglichen recycelt wird. So etwas wie dieses (ich schrieb gerade einige Pseudo-code):

Cursor c = db.rawQuery("SELECT Column1, Column2 .... FROM table " + ... , ...);

Lösung:

Siehe meine Lösung hier ! https://stackoverflow.com/a/26797130/1518916

  • "es ist ein AsyncTask ausgeführt wird, innerhalb einer runnable-thread, also selbst wenn die app geschlossen ist, ist es immer noch synchronisiert die Daten im hintergrund, es sei denn, Sie streichen, schließen Sie es aus dem android task-manager" ich glaube nicht, dass dein thread/async wird noch laufen, wenn Ihre apps geschlossen. Erwägen Sie die Verwendung einer SERVICE-statt. Thread & Async wird geschlossen, wenn die activity zerstört wird.
  • Ich Stimme mit Ihnen..
  • Überprüfen Sie auch die Plattform-version dieser Hinweis-8-tablets.
  • Es läuft und synchronisiert, selbst wenn die app geschlossen ist. Ich will nicht zur Nutzung des Dienstes auf dieser Stufe. Wenn die activity zerstört wird aka geklaut aus dem android task-manager, dann Stoppt es, und das ist genau das, was ich will, und es funktioniert ganz gut. vovahost-Sie alle nutzen die gleiche Plattform und die Android-version. Die firmware / build ist die gleiche wie einige andere Tabletten, aber es gibt auch viele andere mit unterschiedlichen build-Versionen, die funktioniert auch einwandfrei.
  • wo bekommt man die Fehlermeldung (Fehler beim Lesen der Zeile 0, Spalte 0 ...)?
  • innerhalb der sync-Methode innerhalb der Teil, wo ich bin Durchlaufen der Datenbank. Der Teil, der liest //tut lookups hier und füllen sync-arrays
  • so sind Sie versuchen zu Lesen, eine erste Zeile eine leere CursorWindow finden Sie unter: androidxref.com/4.4_r1/xref/frameworks/base/libs/androidfw/...
  • Bitte siehe mein update im original-Beitrag, ich denke ich weiß was das problem verursacht.

InformationsquelleAutor Janpan | 2014-11-05
Schreibe einen Kommentar