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/gradient_background.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 {
|
||||
const ChatScreen({super.key});
|
||||
@@ -18,6 +20,9 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||
int? _currentStreamingMessageIndex;
|
||||
int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量
|
||||
|
||||
final DatabaseHelper _dbHelper = DatabaseHelper();
|
||||
List<Message> _messagesDB = [];
|
||||
|
||||
void _handleSendMessage(String text) {
|
||||
if (text.trim().isEmpty) return;
|
||||
setState(() {
|
||||
@@ -41,6 +46,12 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||
));
|
||||
_lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数
|
||||
_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) {
|
||||
_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
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@@ -38,6 +38,8 @@ dependencies:
|
||||
record: ^6.0.0
|
||||
http: ^1.2.1
|
||||
path_provider: ^2.1.2
|
||||
sqflite: ^2.4.2
|
||||
path: ^1.9.1
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
||||
Reference in New Issue
Block a user