今天看到微信团队的一篇文章,说是自家的开源的终端数据库WCDB进行了重大升级 原文章在这里,感兴趣的朋友们可以围观一下:《五年沉淀,微信全平台终端数据库WCDB迎来重大升级》
wcdb数据库的新版本提供了更丰富的开发语言支持,更强大的SQL表达能力,更安全的数据存储能力,更灵活的数据扩展能力,更细致的性能优化能力等。今天我们来看看到底是怎么个事儿
WCDB是微信团队开源的一款基于SQLite的终端数据库。它的特点包括:
https://github.com/Tencent/wcdb
database.query("SELECT * FROM orders WHERE amount > ?", [minAmount]);
这样的代码不仅易于理解,而且减少了出错的可能性。// C++
database.insertObjects<Sample>(Sample(1, "text"), myTable);
database.updateRow("text2", WCDB_FIELD(Sample::content), myTable, WCDB_FIELD(Sample::id) == 1);
auto objects = database.getAllObjects<Sample>(myTable, WCDB_FIELD(Sample::id) > 0);
database.deleteObjects(myTable, WCDB_FIELD(Sample::id) == 1);
// Java
database.insertObject(new Sample(1, "text"), DBSample.allFields(), myTable);
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1));
List<Sample> objects = database.getAllObjects(DBSample.allFields(), myTable, DBSample.id.gt(0));
database.deleteObjects(myTable, DBSample.id.eq(1));
// Kotlin
database.insertObject<Sample>(Sample(1, "text"), DBSample.allFields(), myTable)
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1))
val objects = database.getAllObjects<Sample>(DBSample.allFields(), myTable, DBSample.id.gt(0))
database.deleteObjects(myTable, DBSample.id.eq(1))
// Swift
try database.insert(Sample(id:1, content:"text"), intoTable: myTable)
try database.update(table: myTable,
on: Sample.Properties.content,
with: "text2"
where:Sample.Properties.id == 1)
let objects: [Sample] = try database.getObjects(fromTable: myTable,
where: Sample.Properties.id > 0)
try database.delete(fromTable: myTable where: Sample.Properties.id == 1)
// Objc
[database insertObject:sample intoTable:myTable];
[database updateTable:myTable
setProperty:Sample.content
toValue:@"text2"
where:Sample.id == 1];
NSArray* objects = [database getObjectsOfClass:Sample.class
fromTable:myTable
where:Sample.id > 0];
[database deleteFromTable:myTable where:Sample.id == 1];
在WCDB 1.0中,备份和修复方案主要是针对SQLite数据库的页码进行备份,以解决数据库损坏后数据丢失的问题。然而,这种方案对于磁盘损坏导致的大面积数据丢失情况修复效果并不理想。
在新版WCDB中,备份和修复方案得到了重大升级。除了备份master表,还增加了备份普通表的表名到其叶子页页号和crc校验值的映射。这样一来,修复的时候可以根据页号直接找到普通表的数据,校验crc值未变,即可确认数据没有损坏或变更,从而将未损坏的数据完整恢复到新数据库。此外,还优化了备份性能,使得平均备份耗时仅为63ms,即便是大到10G的DB,备份耗时也不到0.9秒。