flutter Moor数据库
2020-11-07 本文已影响0人
liboxiang
https://moor.simonbinder.eu/docs/getting-started/
moor.pngExpression<D>
- moor中Table中的Column或者where中的条件设定都是
Expression<D>
,Expression<D>
能将自身对应的sql写到GenerationContext
的StringBuffer
中 - 如此一来,每条数据库命令就可以通过
GenerationContext
的StringBuffer
得到 GenerationContext
GenerationContext的创建和sql命令的拼接在以下方法中,以下方法一般在go()方法中调用
GenerationContext constructQuery() {
final ctx = GenerationContext.fromDb(database);
// whether we need to insert a space before writing the next component
var needsWhitespace = false;
void writeWithSpace(Component /*?*/ component) {
if (component == null) return;
if (needsWhitespace) ctx.writeWhitespace();
component.writeInto(ctx);
needsWhitespace = true;
}
writeStartPart(ctx);
needsWhitespace = true;
writeWithSpace(whereExpr);
writeWithSpace(_groupBy);
writeWithSpace(orderByExpr);
writeWithSpace(limitExpr);
ctx.buffer.write(';');
return ctx;
}
}
join
https://www.w3schools.com/sql/sql_join.asp
如下所示,
-
leftOuterJoin
则是所有MyDatabase().todos会被取出,MyDatabase().categories.id.equalsExp(MyDatabase().todos.category)
的MyDatabase().categories会被取出 -
innerJoin
则是MyDatabase().categories.id.equalsExp(MyDatabase().todos.category)
的MyDatabase().categories和MyDatabase().todos才会被取出 -
crossJoin
则是MyDatabase().categories和MyDatabase().todos都会被取出,且交叉匹配。也就是如果MyDatabase().categories有3条数据MyDatabase().todos有2条数据,则select得到2x3=6条数据
MyDatabase()
.select(MyDatabase().todos)
.join(
[
leftOuterJoin(
MyDatabase().categories,
MyDatabase().categories.id.equalsExp(MyDatabase().todos.category),
),
// crossJoin(
// MyDatabase().categories,
// ),
],
)
.get()
.then((value) {
print(value);
value.forEach((e){
print(e.readTable(MyDatabase().todos)?.toJson());
print(e.readTable(MyDatabase().categories)?.toJson());
});
});