Ошибка при вставке данных в БД android - PullRequest
1 голос
/ 13 июля 2020

У меня есть две таблицы в базе данных, записи, содержащие только слова столбца, и еще один словарь слов со столбцами word, определение и auduiourl,

 String create_table_query = "CREATE TABLE `entries` (`word` varchar(50) NOT NULL)";
 db.execSQL(create_table_query);

 String create_word_table = "CREATE TABLE `worddictionary` (`word` TEXT NOT NULL,'definition' TEXT, 'audiourl' TEXT)";
 db.execSQL(create_word_table);

Я пытаюсь вставить слова, их определение и аудио что я получил с помощью извлечения веб-страниц в таблицу worddictionary,

 String insert_query = "INSERT INTO worddictionary values("+word+","+wordDefinition+","+audioUrl+")";
 db.execSQL(insert_query);

Но я получаю ошибку ниже:

2020-07-13 14:11:56.527 27078-27131/com.example.scraping_synonyms E/SQLiteLog: (1) near "large": syntax error
2020-07-13 14:11:56.529 27078-27131/com.example.scraping_synonyms E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.scraping_synonyms, PID: 27078
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: android.database.sqlite.SQLiteException: near "large": syntax error (code 1 SQLITE_ERROR): , while compiling: INSERT INTO worddictionary values(aardvark,noun,
    a large, nocturnal, burrowing mammal, Orycteropus afer, of central and southern Africa, feeding on ants and termites and having a long, extensile tongue, strong claws, and long ears.
    ,https://static.sfdict.com/audio/A00/A0001900.mp3)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1770)
        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1698)
        at com.example.scraping_synonyms.MainActivity$Content.doInBackground(MainActivity.java:140)
        at com.example.scraping_synonyms.MainActivity$Content.doInBackground(MainActivity.java:74)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)

В этой ошибке упоминается ошибка рядом с «большим», то есть слово в определении не понимаю, в чем ошибка

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы хотите вставить строку из 3 столбцов в таблицу worddictionary, но вы пытаетесь вставить только 1 строку, объединяя строки word, wordDefinition и audioUrl.

Правильный синтаксис для оператора INSERT следующий:

INSERT INTO tablename(col1, col2, col3) VALUES (value1, value2, value3)

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

Итак, чтобы быть синтаксически правильным, вы должны перечислить все имена столбцов после имени таблицы и вставить каждый столбец отдельно:

String insert_query = "INSERT INTO worddictionary (word, wordDefinition, audioUrl) values ('" + 
                      word + "', '" + wordDefinition + "', '" + audioUrl + "')";
db.execSQL(insert_query);

Но рекомендуемый и безопасный способ сделать это - использовать метод insert() с ContentValues(), который заботится о кавычках в этих случаях:

ContentValues cv = new ContentValues();
cv.put("word", word);
cv.put("definition", wordDefinition);
cv.put("audiourl", audioUrl);
int result = db.insert("worddictionary", cv);

Вы можете проверить переменную result после вставки. Если это -1, то произошла ошибка.

0 голосов
/ 13 июля 2020

Может быть, это потому, что отметки вокруг word отличаются от definition?

И парень, которого я заменил, использовал значения Content, так что для вас это будет

ContentValues values = new ContentValues();
values.put("word", word);
values.put("definition", definition);
values.put("audiourl", audiourl);

db.insert("worddictionary", null, values);
...