Трепетание, как кратко превратить списки, закодированные как строки для базы данных SQFL, в списки? - PullRequest
0 голосов
/ 13 апреля 2020

Боюсь, я пытаюсь изобрести колесо здесь. Я помещаю Объекты в свою базу данных SQFL: https://pub.dev/packages/sqflite

некоторые поля объекта являются списками целых чисел, другие списками строк. Я кодирую их как простые строки, чтобы поместить в поле TEXT в моей базе данных SQFL.

В какой-то момент мне придется повернуть их обратно, я не смог ничего найти в Google, что удивительно, потому что это должно быть очень распространенным явлением с SQFL

. Я начал кодировать «декодирование», но это ладья ie дротик. Есть ли что-нибудь полезное вокруг, что я должен использовать?

Код, включенный, чтобы доказать, что я не совсем ленивый, не нужно искать, крайние случаи делают его неудачным.

  List<int> listOfInts = new List<int>();

  String testStringOfInts = "[1,2,4]";
  List<String> intermediateStep2 = testStringOfInts.split(',');

  int numListElements = intermediateStep2.length;

  print("intermediateStep2: $intermediateStep2, numListElements: $numListElements");
  for (int i = 0; i < numListElements; i++) {
    if (i == 0) {
      listOfInts.add(int.parse(intermediateStep2[i].substring(1)));
      continue;
    }
    else if ((i) == (numListElements - 1)) {
      print('final element: ${intermediateStep2[i]}');
      listOfInts.add(int.parse(intermediateStep2[i].substring(0, intermediateStep2[i].length - 1)));
      continue;
    }
    else listOfInts.add(int.parse(intermediateStep2[i]));
  }
  print('Output: $listOfInts');

  /* DECODING LISTS OF STRINGS */
  String testString = "['element1','element2','element23']";
  List<String> intermediateStep = testString.split("'");
  List<String> output = new List<String>();

  for (int i = 0; i < intermediateStep.length; i++) {
    if (i % 2 == 0) {
      continue;
    } else {
      print('adding a value to output: ${intermediateStep[i]}');
      //print('value is a: ${(intermediateStep[i]).runtimeType}');
      output.add(intermediateStep[i]);
    }
  }
  print('Output: $output');
}

1 Ответ

1 голос
/ 13 апреля 2020

Для целых чисел вы можете сделать синтаксический анализ:

void main() {
  print(parseStringAsIntList("[1,2,4]")); // [1, 2, 4]
}

List<int> parseStringAsIntList(String stringOfInts) => stringOfInts
    .substring(1, stringOfInts.length - 1)
    .split(',')
    .map(int.parse)
    .toList();

Мне нужна дополнительная информация о том, как строки сохраняются в некоторых угловых случаях, например, если они содержат , и / или ', так как это изменит способ синтаксического анализа. Но если в строке допустимы оба символа (особенно ,), я рекомендую вам изменить формат хранения на JSON, что значительно упрощает кодирование / декодирование и без риска использования символов, которые могут дать вам вопросов).

Но довольно наивное решение может быть принято следующим образом, если мы знаем, что каждая строка не содержит ,:

void main() {
  print(parseStringAsStringList("['element1','element2','element23']"));
  // [element1, element2, element23]
}

List<String> parseStringAsStringList(String stringOfStrings) => stringOfStrings
    .substring(1, stringOfStrings.length - 1)
    .split(',')
    .map((string) => string.substring(1, string.length - 1))
    .toList();
...