dart Firestore -意外读取

edqdpe6u  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(67)

伙计们,我这里确实有一个有趣的问题,如果你们中的任何一个能帮助我,我会很高兴的。
我的应用程序流程是什么:
1.使用电子邮件、密码和其他详细信息注册:
1.用户firebase为了验证用户并通过电子邮件和密码创建一个帐户,同时我正在将用户的自定义数据写入数据库。
1.登录用户。
就是这样,这就是我所有的基本逻辑,你怎么能看到我没有做任何阅读从数据库,据我所知。
现在...问题是,由于一些奇怪的原因,当我注册我的用户时,我会去firebase控制台查看我的数据库的使用情况,我会看到类似于...对于一个创建的用户,我将有1个写入(正如我所期望的那样),但也有13-20个从数据库读取
现在这是我的问题,为什么在地球上,我有在火 Storm 时,我只是做认证和写作?
这是我现在使用的DB代码。

class DatabaseFirebase implements BaseDataBase {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final FirebaseStorage _storage = FirebaseStorage.instance;

  FirebaseUser _firebaseUser;
  Firestore _firestore = Firestore.instance;

  @override
  Future<String> login(String email, String password) async {
    _firebaseUser = await _firebaseAuth.signInWithEmailAndPassword(
        email: email, password: password);
    return _firebaseUser.uid;
  }

  @override
  Future<String> register(String email, String password) async {
    _firebaseUser = await _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
    return _firebaseUser.uid;
  }

  @override
  Future<UserData> getCurrentUser() async {
    if (_firebaseUser == null)
      _firebaseUser = await _firebaseAuth.currentUser();
    UserData user = UserData();
    user.email = _firebaseUser?.email;
    user.name = _firebaseUser?.displayName;
    return user;
  }

  @override
  Future<void> logout() async {
    _firebaseAuth.signOut();
  }

  @override
  Future<void> onAuthStateChanged(void Function(FirebaseUser) callback) async {
    _firebaseAuth.onAuthStateChanged.listen(callback);
  }

  @override
  Future<void> writeUser(UserData user) async {
    _firestore.collection("Users").add(user.toMap()).catchError((error) {
      print(error);
    });
  }
}

如果你们中的一些人知道,你们能向我解释一下我需要在哪里/如何搜索才能找到这个bug吗?因为你怎么能看到我没有用任何读什么。

uemypmqf

uemypmqf1#

由于我们不了解所有可能的数据库访问路径,因此无法确定,但您应该注意使用Firebase控制台将导致读取。如果您在一个忙碌上保持控制台打开状态,控制台将自动读取更新控制台显示的更改。这往往是意外阅读的来源。
如果没有完整的繁殖步骤,你所采取的所有步骤,就没有办法确定。
Firebase目前不提供跟踪文档读取来源的工具。如果你需要测量应用程序的特定读取量,你必须以某种方式自己跟踪。

dgtucam1

dgtucam12#

啊,如果你正在使用Flutter,那么你将使用cloud_firestore包与Firestore交互。让我们在此上下文中处理意外读取。
1.优化配置
仅获取必要的字段:

final FirebaseFirestore firestore = FirebaseFirestore.instance;
final limitedFields = firestore.collection('users').select(['name', 'email']);

1.使用分页
使用limitstartAfterDocument进行分页:

final firstPage = firestore.collection('users').orderBy('name').limit(10);
DocumentSnapshot? lastDocument;

firstPage.get().then((snapshot) {
    if (snapshot.docs.isNotEmpty) {
        lastDocument = snapshot.docs.last;

        final secondPage = firestore.collection('users')
                                   .orderBy('name')
                                   .startAfterDocument(lastDocument!)
                                   .limit(10);
        // Fetch the second page when necessary...
    }
});

1.实现缓存
您可以使用Flutter的shared_preferences包进行缓存:

import 'package:shared_preferences/shared_preferences.dart';

final userID = "12345";
final prefs = await SharedPreferences.getInstance();
final cachedData = prefs.getString('user_$userID');

if (cachedData != null) {
    // Use cached data
} else {
    final doc = await firestore.collection('users').doc(userID).get();
    if (doc.exists) {
        prefs.setString('user_$userID', doc.data().toString());
        // Use the fetched data
    }
}

1.审核客户代码
确保你没有在循环中进行不必要的Firestore调用:

for (var user in users) {
    // Fetch data related to this user only
    final userData = await firestore.collection('users').doc(user.id).get();
    // ... Process userData
}

1.设置持久性
Firestore允许您启用脱机数据持久性。这可以帮助减少应用从本地缓存中获取时的读取,而不是总是命中服务器。

await FirebaseFirestore.instance.enablePersistence();

请记住,虽然shared_preferences可以用于轻量级缓存,但对于更大的数据或更结构化的存储,请考虑在Flutter中使用sqflite或其他本地数据库解决方案。
使用Firebase的性能监控工具来了解您使用Firestore的频率并确定优化区域也很好。始终彻底测试您的应用程序,并考虑与数据库操作相关的读/写成本。

相关问题