将数据插入数据库时出错 android
Error while inserting data into DB android
我在数据库中有两个 table,条目只有词列,另一个 table 词词典有词、定义和音频列,
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);
我正在尝试将我使用网络抓取得到的单词、它的定义和 audiourl 插入到 worddictionary table、
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.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.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.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
在这个错误中,提到了“large”附近的错误,也就是定义中的单词
我不明白错误是什么
难道是因为 word
周围的标记与 definition
不同?
我替换的那个人使用了内容值,所以对你来说就是
ContentValues values = new ContentValues();
values.put("word", word);
values.put("definition", definition);
values.put("audiourl", audiourl);
db.insert("worddictionary", null, values);
您想在 table worddictionary
中插入一行 3 列,但您所做的是尝试通过连接字符串 word
、[=15 来仅插入 1 个字符串=] 和 audioUrl
。
INSERT
语句的正确语法是这样的:
INSERT INTO tablename(col1, col2, col3) VALUES (value1, value2, value3)
如果任何值是字符串,则必须 用单引号括起来。
因此,为了在语法上正确,您应该在 table 的名称之后枚举所有列名并分别插入每一列:
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
则发生错误。
我在数据库中有两个 table,条目只有词列,另一个 table 词词典有词、定义和音频列,
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);
我正在尝试将我使用网络抓取得到的单词、它的定义和 audiourl 插入到 worddictionary table、
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.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.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.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
在这个错误中,提到了“large”附近的错误,也就是定义中的单词 我不明白错误是什么
难道是因为 word
周围的标记与 definition
不同?
我替换的那个人使用了内容值,所以对你来说就是
ContentValues values = new ContentValues();
values.put("word", word);
values.put("definition", definition);
values.put("audiourl", audiourl);
db.insert("worddictionary", null, values);
您想在 table worddictionary
中插入一行 3 列,但您所做的是尝试通过连接字符串 word
、[=15 来仅插入 1 个字符串=] 和 audioUrl
。
INSERT
语句的正确语法是这样的:
INSERT INTO tablename(col1, col2, col3) VALUES (value1, value2, value3)
如果任何值是字符串,则必须 用单引号括起来。
因此,为了在语法上正确,您应该在 table 的名称之后枚举所有列名并分别插入每一列:
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
则发生错误。