Флаттер sqflite вставка Список <String> - PullRequest
2 голосов
/ 31 октября 2019

Я пытаюсь вставить список в базу данных sql во флаттере, но я не знаю, как я могу это сделать, кто-нибудь может мне помочь?

у меня есть это, когда я инициализирую базу данных mi:

Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "tuCuestionarioDB.db");
    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute("CREATE TABLE Question ("
          "id INTEGER PRIMARY KEY,"
          "subject INTEGER,"
          "topic INTEGER,"
          "question TEXT,"
          "answer INTEGER,"
          "answers TEXT ARRAY," //THIS IS MY LIST<STRING>
          "rightAnswer INTEGER,"
          "correctly BIT,"
          "answered BIT"
          ")");
    });

, и у меня есть это для вставки данных:

 newQuestion(Question newQuestion) async {
     final db = await database;
    //get the biggest id in the table
    var table = await db.rawQuery("SELECT MAX(id)+1 as id FROM Question");
    int id = table.first["id"];
    //insert to the table using the new id
    var raw = await db.rawInsert(
        "INSERT Into Question (id,subject,topic,question,answer,answers,rightAnswer,correctly,answered)"
        " VALUES (?,?,?,?,?,?,?,?,?)",
        [id != null ? id : 0, newQuestion.subject, newQuestion.topic,newQuestion.question,newQuestion.answer,newQuestion.answers,newQuestion.rightAnswer,newQuestion.correctly ? 1 : 0,newQuestion.answered ? 1 : 0]);
    return raw;
  }

, но когда вы пытаетесь вставить значение, подобноеthis:

{subject: 1, topic: 1, question: What is the best community?, answer: 3, rightAnswer: 0, answers: [Stack Overflow, Facebook, Yahoo Answers], correctly: false, answered: false}

Я получил ошибку, подобную этой:

Произошло исключение.

SqfliteDatabaseException (DatabaseException (java.lang.String нельзя привести кjava.lang.Integer) sql 'INSERT Into Question (id, тема, тема, вопрос, ответ, ответы, rightAnswer, правильно, ответил) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?,?)'args [0, 1, 1, что такое лучшее сообщество ?, 3, [переполнение стека, Facebook, ответы Yahoo], 0, 0, 0]})

и когда я удаляю anwsersполе у ​​меня нет ошибок

1 Ответ

1 голос
/ 31 октября 2019

Я уверен, что вы не можете хранить список строк таким образом. Согласно документам , он поддерживает только двоичные объекты. Я думаю, что есть два способа сделать это.

Одним из способов было бы объединить ответы в одну строку. Вы можете использовать метод join и разделить его символом, который не будет содержаться в ответе (возможно, в виде символа |). Затем, когда вы читаете из базы данных, вы можете разделить строку обратно в массив, используя выбранный вами символ.

Другой способ сделать это - создать таблицу, которая связываетодин вопрос с несколькими ответами. Это в основном код sudo, но если у вас есть таблица, которая соответствует этому, она должна работать.

Answer

int id autoincremented, int questionId, String answerText, int isCorrectAnswer (0 or 1)

Кроме того, это немного не связано, но sqflite поддерживает ключевое слово AUTOINCREMENT, которое я рекомендую использовать для идентификаторов первичного ключа. .

...