Flutter 如何在从firebase获取数据后将其放入Hivedb?并从Hivedb访问数据1小时?

Flutter 如何在从firebase获取数据后将其放入Hivedb?并从Hivedb访问数据1小时?,flutter,flutter-hive,hivedb,Flutter,Flutter Hive,Hivedb,我试图将数据作为临时存储在应用程序中1小时 我正在从Firestore获取数据: 静态最终FirebaseFirestore\u firestore=FirebaseFirestore.instance; Future FetchLeadboard()异步{ 最终结果= wait_firestore.collection('users').orderBy('points',降序:true).limit(10.get(); 返回result.docs; } 为了将其存储到HiveDb,我做了以下

我试图将数据作为临时存储在应用程序中1小时

我正在从Firestore获取数据:

静态最终FirebaseFirestore\u firestore=FirebaseFirestore.instance;
Future FetchLeadboard()异步{
最终结果=
wait_firestore.collection('users').orderBy('points',降序:true).limit(10.get();
返回result.docs;
}
为了将其存储到HiveDb,我做了以下工作:

class\u排行榜状态扩展状态{
var_库;
列出用户名单;
盒子;
@凌驾
void initState(){
_repository=repository();
用户=[];
super.initState();
openBox();
}
Future openBox()异步{
var dir=wait path_provider.getApplicationDocumentsDirectory();
初始化(目录路径);
box=wait-Hive.openBox(“排行榜”);
返回;
}
未来的_fetchUsers()异步{
users=wait_repository.fetchLeadboard();
box.put('用户',用户);
打印(“配置单元数据库:”);
打印(box.get('users'));
}
}
现在,如何在1小时内从Hivedb获取它?
1小时后,应再次从Firestore获取数据。

您必须比较日期时间才能实现此目的。在读取数据之前,请先读取是否已过一小时。要做到这一点,您必须在hiveDB中保存上次读取时间。

为此您需要一些类。下面是一个简化的示例:

class Repository {
  final FirebaseApi api = FirebaseApi(); 
  final HiveDatabase database = HiveDatabase();
  
  Future<List<User>> getUsers() async {
    final List<User> cachedUsers = await database.getUsers();
    if(cachedUsers != null) {
      return cachedUsers;
    }
    final List<User> apiUsers = await api.getUsers();
    await database.storeUsers(apiUsers);
    return apiUsers;
  }
  
  
}

class FirebaseApi {
   
  static final FirebaseFirestore _firestore = FirebaseFirestore.instance;
  
  Future<List<User>> getUsers() async {
    final result = await _firestore.collection('users').orderBy('points', descending: true).limit(10).get();
    
    // convert List<DocumentSnapshot> to List<User>
    return result.docs.map((snapshot) {
      return User(
        id: snapshot.id,
        points: snapshot.data()['points'],
      );
    });
  }
}

class HiveDatabase {
  
  Future<List<User>> getUsers() async {
    final DateTime lastUpdated = await _getLastUpdatedTimestamp();
    if(lastUpdated == null) {
      // no cached copy
      return null;
    }
    final deadline = DateTime.now().subtract(Duration(hours: 1));
    if(lastUpdated.isBefore(deadline)) {
      // older than 1 hour
      return null;
    }
    final box = Hive.openBox('leaderboard');
    return box.get('users');
  }

  Future<void> storeUsers(List<User> users) async {
    // update the last updated timestamp
    await _setLastUpdatedTimestamp(DateTime.now());
    // store the users
    final box = Hive.openBox('leaderboard');
    return box.put('users',users);
  }
  
  Future<DateTime> _getLastUpdatedTimestamp() async {
    // TODO get the last updated time out of Hive (or somewhere else)
  }
  
  Future<void> _setLastUpdatedTimestamp(DateTime timestamp) async {
    // TODO store the last updated timestamp in Hive (or somewhere else)
  }
}

class User {
  final String id;
  final int points;
  
  User({this.id, this.points});
}
类存储库{
最终FirebaseApi=FirebaseApi();
最终HiveDatabase数据库=HiveDatabase();
未来的getUsers()异步{
最终列表cachedUsers=await database.getUsers();
if(cachedUsers!=null){
返回缓存器;
}
最终列表apiUsers=wait api.getUsers();
等待数据库。storeUsers(apiUsers);
返回用户;
}
}
类FirebaseApi{
静态最终FirebaseFirestore _firestore=FirebaseFirestore.instance;
未来的getUsers()异步{
最终结果=wait_firestore.collection('users').orderBy('points',降序:true).limit(10).get();
//将列表转换为列表
返回result.docs.map((快照){
返回用户(
id:snapshot.id,
points:snapshot.data()['points'],
);
});
}
}
类HiveDatabase{
未来的getUsers()异步{
final DateTime lastUpdated=等待_getLastUpdatedTimestamp();
if(lastUpdated==null){
//没有缓存副本
返回null;
}
最终截止日期=DateTime.now().减去(持续时间(小时数:1));
如果(最后更新的.isBefore(截止日期)){
//超过1小时
返回null;
}
最终框=Hive.openBox(“排行榜”);
return box.get('users');
}
未来存储用户(列表用户)异步{
//更新上次更新的时间戳
wait_setLastUpdatedTimestamp(DateTime.now());
//存储用户
最终框=Hive.openBox(“排行榜”);
返回框。put('用户',用户);
}
Future\u getLastUpdatedTimestamp()异步{
//TODO从配置单元(或其他地方)获取上次更新的时间
}
Future\u setLastUpdatedTimestamp(日期时间时间戳)异步{
//TODO在配置单元(或其他地方)中存储上次更新的时间戳
}
}
类用户{
最终字符串id;
最终积分;
用户({this.id,this.points});
}
注意:我没有使用Hive的经验,所以存储和读取可能会有所改变

您需要有一个存储库,负责首先检查数据库中的有效数据,如果没有有效的缓存数据,则重定向到api。当新数据从api传入时,存储库将通知数据库存储它

数据库跟踪数据存储的日期时间,以检查一小时后数据是否仍然有效


重要的是,数据库和firebase api不应该相互了解。他们只知道
用户
模型以及可能自己的模型。如果Hive需要使用其他模型,请在存储之前和读取之后将
用户
映射到这些模型。

如何在hiveDB中保存上次读取时间?