我是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中添加的新数据。我还尝试在删除文档后获取文档,但没有得到任何内容。
我有什么遗失的吗?
答案 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);
}