dart 支持Flutter获取多个UUID

s71maibg  于 2023-10-13  发布在  Flutter
关注(0)|答案(1)|浏览(116)

如何优化SQL查询和数据检索过程,以便从三个表中显示用户的关注者:“users”(包含用户元数据)、“followers”(包含所有followers的UUID数组)和“following”(包含所有followers的UUID数组)?目前,我正在检索所有UUID,然后从“users”表中获取每个UUID的配置文件元数据。我尝试在SupplyKey中创建一个外键数组,但遇到了问题。当前代码运行良好,但是否有更有效的查询或分页方法来获取和显示关注者数据?我是SQL新手,从Firebase迁移过来的。谢谢你的帮助。
查询代码:

/// Stores all the UUID from the circle
  List totalFollowers = [];

  /// Fn to fetch all the users in the circle
  Future<void> fetchFollowersDB() async {
    try {
      final data = await supabase
          .from('followers')
          .select('followers_list')
          .eq(
            'user_id',
            _currentUuid,
          )
          .single();

      // Update profileModel with the retrieved data
      if (data != null) {
        totalFollowers = data['followers_list'];
      } else {
        if (kDebugMode) {
          print('Error fetching profile data: ${data.error?.message}');
        }
      }
    } catch (e) {
      if (kDebugMode) {
        print(e);
      }
    }

    update();
  }

  /// Stores all the Profile data for the circle
  List<ProfileModel> followersProfiles = [];

  /// Get Profile data as per UUID
  Future<void> fetchFollowersProfiles() async {
    followersProfiles.clear();

    //
    for (var uuid in totalFollowers) {
      try {
        final data = await supabase
            .from('users')
            .select('*')
            .eq(
              'uuid',
              uuid,
            )
            .single();

        // Add profileModel to circleProfiles
        if (data != null) {
          followersProfiles.add(ProfileModel.fromMap(data));
        } else {
          if (kDebugMode) {
            print('Error fetching profile data: ${data.error?.message}');
          }
        }
      } catch (e) {
        if (kDebugMode) {
          print(e);
        }
      }
    }

    update();
  }

小部件

class FollowersAndFollowingTab extends StatelessWidget {
  List usersList;

  FollowersAndFollowingTab({super.key, required this.usersList});

  @override
  Widget build(BuildContext context) {
    return GetBuilder<DBController>(
      builder: (_) => ListView.builder(
        shrinkWrap: true,
        itemCount: usersList.length,
        itemBuilder: (context, index) {
          ProfileModel userProfile = usersList[index];
          return Padding(
            padding: const EdgeInsets.symmetric(horizontal: 8.0),
            child: Card(
              child: ListTile(
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      fullscreenDialog: true,
                      builder: (context) => ProfileViewScreen(
                        profileModel: userProfile,
                      ),
                    ),
                  );
                },
                leading: Container(
                  width: 50,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8),
                    image: DecorationImage(
                      fit: BoxFit.cover,
                      image:
                          CachedNetworkImageProvider(userProfile.profilePhoto!),
                    ),
                  ),
                ),
                title: Text(
                  '${_bioWidgets.fullNameNoFlag(
                    profileModel: userProfile,
                  )} ${_bioWidgets.returnFlagEmoji(
                    profileModel: userProfile,
                  )}',
                ),
                subtitle: Text('@${userProfile.username!}'),
                trailing: IconButton(
                  onPressed: () {},
                  icon: const Icon(
                    Icons.more_vert,
                    color: Colors.grey,
                  ),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}
unhi4e5o

unhi4e5o1#

好吧,imo将这些值存储为数组违背了关系数据的目的!但我能理解考虑到你是从消防基地来的

数据建模

您当前的方法

更好的方法

获取数据

方法1 -使用FK进行调试

如果你能让SQL来做,为什么还要用你的代码呢?;)
进入Supplement-> Table Editor -> your table -> API并检查这部分:

在查询时也可以获取FK表。尽管考虑到有多个FK指向同一个表,您需要进行一些尝试和错误来使其工作。不管怎样,看起来像这样:

final data = await supabase
   .from('followers')
   .select(`uuid, follower_uuid,
      users (
         uuid,
         name
      )`
    )
   .eq('uuid', _currentUuid)

如果你想把它作为一个数组,有一个SQL函数array来做。如果没有,请在应用程序代码中处理它。
这是我推荐的方法。

方法二-视图

如果您发现自己在将来总是要查询一堆表,那么您可以创建一个“视图”--基本上就是您需要的来自多个表的一组数据。然后可以像查询表一样通过API调用查询视图。
这是一个例子,只是让你知道什么是可能的。
创建视图的示例代码:

create or replace view
  public.followers_with_names WITH (security_invoker = true) as
select distinct
  users.uuid,
  users.name,
  (
    select
      array (
        select
          users2.name
        from
          users users2
        where
          users2.uuid = followers.uuid
      ) as follower_names
  ) as follower_names
from
  users
  join followers on users.uuid = followers.uuid;

之后,如果你像普通表一样调用followers_with_names,你会得到uuidname和一个follower名称数组。像

final data = await supabase
          .from('followers_with_names')
          .select('*')
          .eq(
            'user_id',
            _currentUuid,
          )

无论如何,我很乐意聊天,如果你有更多的疑问。如果你想的话,请在你的个人资料页面上留下你的电子邮件,我会联系你的:)

相关问题