Android上的Couchbase lite不会持久化文档

时间:2016-04-20 05:46:05

标签: android persistence couchbase couchbase-lite

我是Couchbase lite的新手。在添加文档时,我可以使用确切的数据返回文档。但是在删除数据库,重新创建它,然后创建一个新文档时,我仍然会收到旧文档。

在调试时,我发现在写入时,它会对“store”执行此操作,而在读取时,它会从“docCache”中读取它。

我遵循的步骤是:

1)第一次写作:

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

2)第一次阅读:

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

3)删除数据库并重新创建:这是我发现删除所有文档的唯一方法

if (database != null) {
    database.delete();
    database = null;
}

DatabaseOptions options = new DatabaseOptions();
options.setCreate(create);
database = manager.openDatabase(dbName, options);

4)我再次按照步骤1和2进行操作。

现在,我收到旧文档的数据,而不是我在步骤4中添加的新数据。我还尝试在删除文档后获取文档,但没有得到任何内容。

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:1)

在您提到的评论中,您使用的是两个数据库句柄。如果您没有使用相同的Manager来获取句柄,那么这是一个大问题。如果是,则两个数据库应该是相同的引用,当您删除它时,当您尝试访问另一个数据库时将出现错误。如果不是,那么一旦多个线程开始访问这两个数据,您就很容易损坏数据。

答案 1 :(得分:0)

  

删除数据库并重新创建:这是我找到的唯一方法   删除所有文件

删除所有文档的方法是创建包含所有文档的View。然后迭代View的Query结果,并在您迭代的每个文档上执行删除:

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);
}