|
|
|
@ -13,6 +13,9 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
static const String _dbName = 'problems.db'; |
|
|
|
|
static const String _tableName = 'problems'; |
|
|
|
|
|
|
|
|
|
/// 数据库版本号,用于处理表结构升级。 |
|
|
|
|
static const int _dbVersion = 1; |
|
|
|
|
|
|
|
|
|
/// 私有数据库实例,仅在服务内部访问。 |
|
|
|
|
late Database _database; |
|
|
|
|
|
|
|
|
@ -23,21 +26,26 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
_initDatabase(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// 异步初始化数据库连接。如果数据库不存在,则会创建它。 |
|
|
|
|
/// 异步初始化数据库连接。如果数据库不存在,则会创建它;如果版本过旧,则会升级。 |
|
|
|
|
Future<void> _initDatabase() async { |
|
|
|
|
try { |
|
|
|
|
final databasePath = await getDatabasesPath(); |
|
|
|
|
final path = join(databasePath, _dbName); |
|
|
|
|
|
|
|
|
|
_database = await openDatabase(path, version: 1, onCreate: _onCreate); |
|
|
|
|
_database = await openDatabase( |
|
|
|
|
path, |
|
|
|
|
version: _dbVersion, |
|
|
|
|
onCreate: _onCreate, |
|
|
|
|
onUpgrade: _onUpgrade, // 新增:处理数据库版本升级 |
|
|
|
|
); |
|
|
|
|
} catch (e) { |
|
|
|
|
// 在这里添加日志记录,例如 Get.log('数据库初始化失败:$e'); |
|
|
|
|
Get.log('数据库初始化失败:$e', isError: true); |
|
|
|
|
rethrow; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// 数据库创建时的回调函数,用于定义表结构。 |
|
|
|
|
/// **注意**:这里新增了 `operation` 和 `isChecked` 两个字段。 |
|
|
|
|
Future<void> _onCreate(Database db, int version) async { |
|
|
|
|
await db.execute(''' |
|
|
|
|
CREATE TABLE $_tableName( |
|
|
|
@ -47,14 +55,29 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
imageUrls TEXT NOT NULL, |
|
|
|
|
creationTime INTEGER NOT NULL, |
|
|
|
|
syncStatus INTEGER NOT NULL, |
|
|
|
|
operation INTEGER NOT NULL, -- 新增:问题操作类型 |
|
|
|
|
operation INTEGER NOT NULL, |
|
|
|
|
censorTaskId TEXT, |
|
|
|
|
bindData TEXT, |
|
|
|
|
isChecked INTEGER NOT NULL -- 新增:问题是否已检查(SQLite 用 INTEGER 表示布尔值) |
|
|
|
|
isChecked INTEGER NOT NULL |
|
|
|
|
) |
|
|
|
|
'''); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// 数据库版本升级时的回调函数。 |
|
|
|
|
/// 用于在应用更新后,向现有数据库中添加新的列,而不会丢失数据。 |
|
|
|
|
Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async { |
|
|
|
|
Get.log('正在将数据库从版本 $oldVersion 升级到 $newVersion...'); |
|
|
|
|
if (oldVersion < 2) { |
|
|
|
|
// 示例:从版本 1 升级到版本 2,添加一个新的列 'newColumn' |
|
|
|
|
// await db.execute('ALTER TABLE $_tableName ADD COLUMN newColumn TEXT;'); |
|
|
|
|
// Get.log('已添加新列: newColumn'); |
|
|
|
|
} |
|
|
|
|
// if (oldVersion < 3) { |
|
|
|
|
// ... |
|
|
|
|
// } |
|
|
|
|
Get.log('数据库升级完成。'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// --- |
|
|
|
|
|
|
|
|
|
/// **数据操作 (CRUD) 方法** |
|
|
|
@ -74,7 +97,7 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
conflictAlgorithm: ConflictAlgorithm.replace, |
|
|
|
|
); |
|
|
|
|
} catch (e) { |
|
|
|
|
// 可以添加日志记录 |
|
|
|
|
Get.log('插入问题失败:$e', isError: true); |
|
|
|
|
return 0; // 返回 0 表示插入失败 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -91,7 +114,7 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
whereArgs: [id], |
|
|
|
|
); |
|
|
|
|
} catch (e) { |
|
|
|
|
// 可以添加日志记录 |
|
|
|
|
Get.log('删除问题(ID: $id)失败:$e', isError: true); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -109,7 +132,7 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
whereArgs: [problem.id], |
|
|
|
|
); |
|
|
|
|
} catch (e) { |
|
|
|
|
// 可以添加日志记录 |
|
|
|
|
Get.log('更新问题(ID: ${problem.id})失败:$e', isError: true); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -131,7 +154,7 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} catch (e) { |
|
|
|
|
// 可以添加日志记录 |
|
|
|
|
Get.log('获取问题(ID: $id)失败:$e', isError: true); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -181,7 +204,7 @@ class SQLiteProvider extends GetxService {
|
|
|
|
|
|
|
|
|
|
return maps.map((json) => Problem.fromMap(json)).toList(); |
|
|
|
|
} catch (e) { |
|
|
|
|
// 可以添加日志记录 |
|
|
|
|
Get.log('获取问题列表失败:$e', isError: true); |
|
|
|
|
return []; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|