add sqllite utils
This commit is contained in:
56
lib/config/database_helper.dart
Normal file
56
lib/config/database_helper.dart
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'package:sqflite/sqflite.dart';
|
||||||
|
import 'package:path/path.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
class DatabaseHelper {
|
||||||
|
static final DatabaseHelper _instance = DatabaseHelper._internal();
|
||||||
|
factory DatabaseHelper() => _instance;
|
||||||
|
static Database? _database;
|
||||||
|
|
||||||
|
DatabaseHelper._internal();
|
||||||
|
|
||||||
|
Future<Database> get database async {
|
||||||
|
if (_database != null) return _database!;
|
||||||
|
_database = await _initDatabase();
|
||||||
|
return _database!;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Database> _initDatabase() async {
|
||||||
|
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||||
|
String path = join(documentsDirectory.path, 'chat.db');
|
||||||
|
return await openDatabase(
|
||||||
|
path,
|
||||||
|
version: 1,
|
||||||
|
onCreate: _onCreate,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _onCreate(Database db, int version) async {
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE messages (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
role TEXT NOT NULL,
|
||||||
|
message TEXT NOT NULL,
|
||||||
|
timestamp INTEGER DEFAULT (strftime('%s', 'now'))
|
||||||
|
''');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 插入一条消息
|
||||||
|
Future<int> insertMessage(Map<String, dynamic> message) async {
|
||||||
|
Database db = await database;
|
||||||
|
return await db.insert('messages', message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有消息(按时间排序)
|
||||||
|
Future<List<Map<String, dynamic>>> getMessages() async {
|
||||||
|
Database db = await database;
|
||||||
|
return await db.query('messages', orderBy: 'timestamp ASC');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除所有消息
|
||||||
|
Future<int> clearMessages() async {
|
||||||
|
Database db = await database;
|
||||||
|
return await db.delete('messages');
|
||||||
|
}
|
||||||
|
}
|
||||||
13
lib/models/message_model.dart
Normal file
13
lib/models/message_model.dart
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
class Message {
|
||||||
|
final String role; // 'user' 或 'assistant'
|
||||||
|
final String message;
|
||||||
|
|
||||||
|
Message({required this.role, required this.message});
|
||||||
|
|
||||||
|
Map<String, dynamic> toMap() {
|
||||||
|
return {
|
||||||
|
'role': role,
|
||||||
|
'message': message,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,9 @@ import '../widgets/chat_bubble.dart';
|
|||||||
import '../widgets/chat_input.dart';
|
import '../widgets/chat_input.dart';
|
||||||
import '../widgets/gradient_background.dart';
|
import '../widgets/gradient_background.dart';
|
||||||
import '../models/chat_message.dart';
|
import '../models/chat_message.dart';
|
||||||
import 'dart:convert';
|
//import 'dart:convert';
|
||||||
|
import '../config/database_helper.dart';
|
||||||
|
import '../models/message_model.dart';
|
||||||
|
|
||||||
class ChatScreen extends StatefulWidget {
|
class ChatScreen extends StatefulWidget {
|
||||||
const ChatScreen({super.key});
|
const ChatScreen({super.key});
|
||||||
@@ -18,6 +20,9 @@ class _ChatScreenState extends State<ChatScreen> {
|
|||||||
int? _currentStreamingMessageIndex;
|
int? _currentStreamingMessageIndex;
|
||||||
int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量
|
int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量
|
||||||
|
|
||||||
|
final DatabaseHelper _dbHelper = DatabaseHelper();
|
||||||
|
List<Message> _messagesDB = [];
|
||||||
|
|
||||||
void _handleSendMessage(String text) {
|
void _handleSendMessage(String text) {
|
||||||
if (text.trim().isEmpty) return;
|
if (text.trim().isEmpty) return;
|
||||||
setState(() {
|
setState(() {
|
||||||
@@ -41,6 +46,12 @@ class _ChatScreenState extends State<ChatScreen> {
|
|||||||
));
|
));
|
||||||
_lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数
|
_lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数
|
||||||
_currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡
|
_currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡
|
||||||
|
|
||||||
|
_addMessage(Message(
|
||||||
|
role: 'user',
|
||||||
|
message: text,
|
||||||
|
));
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,6 +87,11 @@ class _ChatScreenState extends State<ChatScreen> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_addMessage(Message(
|
||||||
|
role: 'assistant',
|
||||||
|
message: text,
|
||||||
|
));
|
||||||
|
|
||||||
// 如果完成了,重置索引
|
// 如果完成了,重置索引
|
||||||
if (isComplete) {
|
if (isComplete) {
|
||||||
_currentStreamingMessageIndex = null;
|
_currentStreamingMessageIndex = null;
|
||||||
@@ -83,6 +99,20 @@ class _ChatScreenState extends State<ChatScreen> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _loadMessages() async {
|
||||||
|
List<Map<String, dynamic>> records = await _dbHelper.getMessages();
|
||||||
|
setState(() {
|
||||||
|
_messagesDB = records.map((record) => Message(
|
||||||
|
role: record['role'],
|
||||||
|
message: record['message'],
|
||||||
|
)).toList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _addMessage(Message message) async {
|
||||||
|
await _dbHelper.insertMessage(message.toMap());
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ dependencies:
|
|||||||
record: ^6.0.0
|
record: ^6.0.0
|
||||||
http: ^1.2.1
|
http: ^1.2.1
|
||||||
path_provider: ^2.1.2
|
path_provider: ^2.1.2
|
||||||
|
sqflite: ^2.4.2
|
||||||
|
path: ^1.9.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user