2016-04-20 11 views
0

Ich bin neu in Couchbase Lite. Beim Hinzufügen eines Dokuments kann ich das Dokument mit den exakten Daten zurückerhalten. Aber wenn ich die Datenbank lösche, neu erstelle und dann ein neues Dokument erstelle, bekomme ich immer noch das ältere Dokument.Couchbase Lite auf Android nicht persistent Dokument

Beim Debugging habe ich festgestellt, dass beim Schreiben, es in den "Speicher", während beim Lesen liest es aus dem 'docCache'.

Die Schritte, die ich gefolgt sind:

1) Schreiben erstes Mal: ​​

Document doc = database.getDocument(DOC_ID); 
doc.putProperties(map); 

2) Lese erstes Mal: ​​

Document doc = database.getDocument(DOC_ID); 
Map<String, Object> map = doc.getProperties(); 

3) Datenbank löschen und neu erstellen: Nur so lösche ich alle Dokumente

4) Ich folge den Schritten 1 und 2 erneut.

Jetzt bekomme ich die Daten des älteren Dokuments, nicht die neue, die ich in Schritt 4 hinzugefügt habe. Ich habe auch versucht, das Dokument nach dem Löschen des Dokuments zu bekommen, aber nichts bekommen.

Gibt es etwas, das mir fehlt?

+1

Mein erster Gedanke wäre, zu bestätigen, dass die Datenbank aus irgendeinem Grund zum Zeitpunkt 3 nicht null ist. Auch als Plausibilitätsprüfung werden die Schritte 1 und 2 mit * verschiedenen * Daten jedes Mal hinzugefügt? – borrrden

+0

@borrrden, ja jedesmal werden verschiedene Daten hinzugefügt - eigentlich eine Liste mit einem Element fehlt. Ich habe Ihre Aussage zu Schritt 3 nicht verstanden. – rajath

+1

Was ich meinte war, dass "database.delete()" tatsächlich aufgerufen wird (d. H. Nicht null) und Sie mit derselben Datenbankinstanz arbeiten? – borrrden

Antwort

1

In den Kommentaren Sie erwähnten, dass Sie zwei Datenbank Griffe verwenden. Wenn Sie nicht die gleichen Manager verwenden, um die Griffe zu bekommen, dann ist dies ein großes Problem. Wenn dies der Fall ist, sollten beide Datenbanken dieselbe Referenz sein. Wenn Sie sie löschen, wird ein Fehler angezeigt, wenn Sie versuchen, auf die andere zuzugreifen. Wenn dies nicht der Fall ist, können Sie Ihre Daten leicht beschädigen, sobald mehrere Threads auf beide zugreifen.

+0

Also, wenn ich von einem Dienst, der in einem anderen Prozess läuft, in die Datenbank schreibe, kann ich nicht aus der gleichen Datenbank im Prozess der App lesen? – rajath

+1

Sie werden in der Lage sein, aber Sie werden in Caching-Probleme laufen und Sie werden nicht in der Lage zu sehen, was ein Handle schrieb von der anderen Handle, weil es nicht wissen, dass es neue Daten gibt. Es wird erwartet, dass Sie nur einen Handle für eine bestimmte Datenbank verwenden. Wenn Sie daran interessiert sind, zwischen ihnen zu teilen, sollten Sie die Replikation verwenden. – borrrden

+0

Aber mit der Replikation wird es zwei Datenbanken (synchron) geben. Ist das korrekt? – rajath

0

Datenbank löschen und neu zu erstellen: Dies ist die einzige Art, wie ich zu gefunden löschen Sie alle Dokumente

Eine Möglichkeit, alle Dokumente zu löschen ist eine View zu erstellen, die alle Ihre Dokumente hat . Dann iterieren auf die Abfrageergebnisse der Ansicht, und in jedem Dokument ITERATE Sie führen eine Lösch:

final View allDocumentsView = couchDatabase.getView("allDocumentsView"); 
if (allDocumentsView.getMap() == null) { 
    allDocumentsView.setMap(
      new Mapper() { 
       @Override 
       public void map(Map<String, Object> document, Emitter emitter) { 
        if (doc != null) { 
         emitter.emit((String) document.get("_id"), document); 
        } 
       } 
      }, "1" 
    ); 
} 

final Query allDocumentsQuery = allDocumentsView.createQuery(); 
try { 
    for (Iterator<QueryRow> iterator = allDocumentsQuery.run(); iterator.hasNext();) { 
     iterator.next().getDocument().delete(); 
    } 
} catch (Exception e) { 
    Log.e("Error", "Error deleting document.", e); 
} 
+0

Dies scheint keinen Unterschied zu machen. Es sieht so aus, als gäbe es noch etwas anderes ... vielleicht sind der Laden und der Cache nicht synchron oder so etwas! – rajath

Verwandte Themen