MST

星途 面试题库

面试题:Flutter基于SQLite数据持久化的复杂场景处理

在一个Flutter社交应用中,使用SQLite存储用户动态信息,每个动态可能包含文本、图片、视频等多媒体内容,同时要支持用户对动态进行点赞、评论等操作。请设计数据库架构,并详细说明如何实现数据的持久化、更新以及复杂查询,例如查询某个用户点赞过的所有动态。
38.9万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

数据库架构设计

  1. 用户动态表(posts)

    • id:整数类型,主键,自增长,唯一标识每条动态。
    • user_id:整数类型,关联用户表,表明这条动态属于哪个用户。
    • text:文本类型,存储动态的文本内容,可以为空。
    • image_path:文本类型,存储图片的路径,如果有图片则记录路径,否则为空。
    • video_path:文本类型,存储视频的路径,如果有视频则记录路径,否则为空。
    • created_at:日期时间类型,记录动态创建的时间。
  2. 点赞表(likes)

    • id:整数类型,主键,自增长。
    • user_id:整数类型,关联用户表,表明点赞的用户。
    • post_id:整数类型,关联posts表,表明点赞的动态。
    • created_at:日期时间类型,记录点赞的时间。
  3. 评论表(comments)

    • id:整数类型,主键,自增长。
    • user_id:整数类型,关联用户表,表明评论的用户。
    • post_id:整数类型,关联posts表,表明评论的动态。
    • comment_text:文本类型,存储评论的内容。
    • created_at:日期时间类型,记录评论的时间。

数据持久化实现

在Flutter中使用sqflite库来操作SQLite数据库。

  1. 创建数据库
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future<Database> initDatabase() async {
  final databasePath = await getDatabasesPath();
  final path = join(databasePath, 'social_app.db');

  return openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      await db.execute('''
        CREATE TABLE posts (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id INTEGER,
          text TEXT,
          image_path TEXT,
          video_path TEXT,
          created_at DATETIME
        )
      ''');
      await db.execute('''
        CREATE TABLE likes (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id INTEGER,
          post_id INTEGER,
          created_at DATETIME,
          FOREIGN KEY (post_id) REFERENCES posts(id)
        )
      ''');
      await db.execute('''
        CREATE TABLE comments (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id INTEGER,
          post_id INTEGER,
          comment_text TEXT,
          created_at DATETIME,
          FOREIGN KEY (post_id) REFERENCES posts(id)
        )
      ''');
    },
  );
}
  1. 插入数据
    • 插入动态
Future<void> insertPost(Database db, int userId, String text, String imagePath, String videoPath) async {
  await db.insert(
    'posts',
    {
      'user_id': userId,
      'text': text,
      'image_path': imagePath,
      'video_path': videoPath,
      'created_at': DateTime.now().toString()
    },
  );
}
- **插入点赞**
Future<void> insertLike(Database db, int userId, int postId) async {
  await db.insert(
    'likes',
    {
      'user_id': userId,
      'post_id': postId,
      'created_at': DateTime.now().toString()
    },
  );
}
- **插入评论**
Future<void> insertComment(Database db, int userId, int postId, String commentText) async {
  await db.insert(
    'comments',
    {
      'user_id': userId,
      'post_id': postId,
      'comment_text': commentText,
      'created_at': DateTime.now().toString()
    },
  );
}

数据更新实现

  1. 更新动态
Future<void> updatePost(Database db, int postId, String text, String imagePath, String videoPath) async {
  await db.update(
    'posts',
    {
      'text': text,
      'image_path': imagePath,
      'video_path': videoPath,
    },
    where: 'id =?',
    whereArgs: [postId],
  );
}
  1. 删除点赞
Future<void> deleteLike(Database db, int userId, int postId) async {
  await db.delete(
    'likes',
    where: 'user_id =? AND post_id =?',
    whereArgs: [userId, postId],
  );
}
  1. 更新评论
Future<void> updateComment(Database db, int commentId, String commentText) async {
  await db.update(
    'comments',
    {
      'comment_text': commentText,
    },
    where: 'id =?',
    whereArgs: [commentId],
  );
}

复杂查询实现

  1. 查询某个用户点赞过的所有动态
Future<List<Map<String, dynamic>>> queryUserLikedPosts(Database db, int userId) async {
  return await db.rawQuery('''
    SELECT posts.*
    FROM posts
    JOIN likes ON posts.id = likes.post_id
    WHERE likes.user_id =?
  ''', [userId]);
}
  1. 查询某个动态的所有评论
Future<List<Map<String, dynamic>>> queryCommentsByPostId(Database db, int postId) async {
  return await db.query(
    'comments',
    where: 'post_id =?',
    whereArgs: [postId],
  );
}
  1. 查询某个用户发布的所有动态
Future<List<Map<String, dynamic>>> queryUserPosts(Database db, int userId) async {
  return await db.query(
    'posts',
    where: 'user_id =?',
    whereArgs: [userId],
  );
}