使用 .limitToFirst 或 .limitToLast 仍然 returns Firebase 实时数据库中的全部数据
Using .limitToFirst or .limitToLast still returns the whole data in Firebase Realtime Database
首先,我是 Whosebug 和 Flutter Web 编码方面的新手。这是我的 Flutter 医生:
[✓] Flutter (Channel dev, v1.13.0, on Mac OS X 10.14.6 18G95, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 10.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.40.2)
[✓] Connected device (3 available)
• No issues found!
现在我得到了一个看起来像这样的数据库:
我想做的是根据 'timestamp/seconds' 查询艺术品的子项,如下所示:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.limitToLast(10)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
看下图:
所以整个数据是 843.9KB.. 请注意,当我执行上面的代码时,我在 return(大约 3KB)中得到 10 个艺术作品子项,但在使用情况中它显示 858.6KB。这意味着它下载了整个艺术作品节点及其所有子节点(加上开销),然后在客户端它将对列表进行排序。
所以问题:
1. 怎么才能真正只下载那10条数据而不是全部获取?
2. Flutter App也是这样吗?
改变这个:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.startAt(1572370553)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
进入这个:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.equalTo(1560908950)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
它必须下载整个数据的原因是因为你想在限制之前进行排序。系统排序需要下载全部数据,然后进行排序。
但是,如果先限制再排序,则只会下载前10个项目,只对这10个项目进行排序。
解决方案:如果您真的想根据子值对整个列表进行排序,则没有解决方法,因此您必须坚持这一点,或者更改您的数据结构以通过 Year/Month[= 进行分类10=]
首先,我是 Whosebug 和 Flutter Web 编码方面的新手。这是我的 Flutter 医生:
[✓] Flutter (Channel dev, v1.13.0, on Mac OS X 10.14.6 18G95, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 10.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.40.2)
[✓] Connected device (3 available)
• No issues found!
现在我得到了一个看起来像这样的数据库:
我想做的是根据 'timestamp/seconds' 查询艺术品的子项,如下所示:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.limitToLast(10)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
看下图:
所以整个数据是 843.9KB.. 请注意,当我执行上面的代码时,我在 return(大约 3KB)中得到 10 个艺术作品子项,但在使用情况中它显示 858.6KB。这意味着它下载了整个艺术作品节点及其所有子节点(加上开销),然后在客户端它将对列表进行排序。
所以问题:
1. 怎么才能真正只下载那10条数据而不是全部获取?
2. Flutter App也是这样吗?
改变这个:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.startAt(1572370553)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
进入这个:
fbDB = database();
fbArtworkRef = fbDB.ref('artworks');
await fbArtworkRef
.orderByChild('last_updated/seconds')
.equalTo(1560908950)
.once(('value'))
.then((value) {
value.snapshot.forEach((child) {
print(child.val());
});
});
它必须下载整个数据的原因是因为你想在限制之前进行排序。系统排序需要下载全部数据,然后进行排序。
但是,如果先限制再排序,则只会下载前10个项目,只对这10个项目进行排序。
解决方案:如果您真的想根据子值对整个列表进行排序,则没有解决方法,因此您必须坚持这一点,或者更改您的数据结构以通过 Year/Month[= 进行分类10=]