Я пытаюсь вставить список в базу данных 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;
}
но когда вы пытаетесь вставить такое значение:
{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, subject, topic, question, answer, answers, rightAnswer, правильно, ответил) ЗНАЧЕНИЯ (?,?,? ,?,?,?,?,?,?) ‘args [0, 1, 1, Какое сообщество лучше всего ?, 3, [Stack Overflow, Facebook, Answers Yahoo], 0, 0, 0]})
и когда я удаляю поле anwsers, у меня нет ошибок
Я почти уверен, что вы не можете хранить список строк таким образом. Согласно docs, он поддерживает только большой двоичный объект. инц. Я думаю, есть два способа сделать это.
Один из способов — объединить ответы в одну строку. Вы можете использовать метод присоединиться и разделить его символом, который не будет содержать ответа (возможно, вертикальной чертой, например |). Затем, когда вы читаете из базы данных, вы можете разделить строку обратно в массив, используя выбранный вами символ.
Другой способ сделать это — создать таблицу, которая связывает один вопрос с несколькими ответами. Это в основном код sudo, но если у вас есть таблица, которая ему соответствует, она должна работать.
Кроме того, это немного не связано, но sqflite поддерживает ключевое слово AUTOINCREMENT, которое я рекомендую вам использовать для идентификаторов ваших первичных ключей.