Хорошо, я пытаюсь сократить огромное количество стандартного кода для своего приложения. Прямо сейчас я вижу необходимость некоторого рефакторинга и серьезной абстракции.
Я хочу абстрагировать действия CRUD для своего кода базы данных. Сейчас я создаю отдельный файл и дублирую код для каждого объекта. Я чувствую, что должен быть лучший способ, но я не знаю, как сохранить явную безопасность типов при абстрагировании с помощью дженериков.
В настоящее время я делаю что-то подобное для КАЖДОГО объекта:
Я очень уверен, что вы можете видеть, как это может свести кого-то с ума, у меня в приложении более 45 объектов... и многие из них сложнее этого.
abstract class HouseDatabaseAPI {
/// CREATE EVENT
/// Create house for authorized user
static Future<void> createHouse({required House newHouse}) async {
Box<House> houseBox = await Hive.openBox<House>('house_box');
await houseBox.put(newHouse);
}
/// READ EVENT
/// Get house for authorized user
static Future<House?> getHouse() async {
Box<House> houseBox = await Hive.openBox<House>('house_box');
House? house = houseBox.getAt(0);
return house;
}
/// UPDATE EVENT
/// Update house for authorized user
static Future<void> updateHouse({House? updatedHouse}) async {
Box<House> houseBox = await Hive.openBox<House>('house_box');
await houseBox.putAt(0, updatedHouse!);
}
/// DELETE EVENT
/// Delete house from the local machine
static Future<void> deleteGroup() async {
Box<House> houseBox = await Hive.openBox<House>('house_box');
await houseBox.deleteAt(0);
}
}
Конечно, я хочу, чтобы это было строго типизировано, а НЕ динамично. Что я хотел бы сделать вместо массивного оператора управления потоком (грубый псевдокод):
enum DatabaseAction {
create,
read,
update,
delete,
}
abstract class DatabaseRoutingAPI {
Future<T> globalDatabaseCreateAction({
DatabaseAction databaseAction,
Object object,
String databaseName,
}) async {
Box<T> houseBox = await Hive.openBox<T>(databaseName);
await houseBox.put(object);
}
...
}





Я направлю вас к одному хорошему источнику из моих закладок об обработке данных Hive -> здесь
И здесь я постараюсь ответить на ваш вопрос:
abstract class Database {
Box get box;
T get<T>(String id);
List<T> getAll<T>();
Future<void> delete(String id);
Future<void> deleteAll(List<String> keys);
Future<void> addUpdate<T>(String id, T item);
}
class DatabaseImplementing implements Database {
const DatabaseImplementing(this._box);
final Box _box;
@override
Box get box => _box;
@override
T get<T>(String id) {
try {
final data = box.get(id);
if (data == null) {
throw Exception('$T not in the box.');
}
return data;
} catch (_) {
rethrow;
}
}
@override
List<T> getAll<T>() {
try {
final data = box.toMap().values;
if (data.isEmpty) {
throw Exception('$T not in the box.');
}
return data.toList().cast<T>();
} catch (_) {
rethrow;
}
}
@override
Future<void> delete(String id) async {
try {
await box.delete(id);
} catch (_) {
rethrow;
}
}
@override
Future<void> addUpdate<T>(String id, T item) async {
try {
await box.put(id, item);
} catch (_) {
rethrow;
}
}
@override
Future<void> deleteAll(List<String> keys) async {
try {
await box.deleteAll(keys);
} catch (_) {
rethrow;
}
}
}
Конечно, есть много других способов сделать это.
Обновлено. Надеюсь, это поможет вам :)
Это именно то, что я искал. На самом деле это не говорит мне о том, как использовать универсальные типы, но это помогает немного ознакомиться. Спасибо. О, и, пожалуйста, разместите здесь какой-нибудь код, чтобы ответить на вопрос более прямо, и я могу принять это как правильный ответ.