gpt4 book ai didi

java - 如何识别SQLite数据库查询异常?

转载 作者:行者123 更新时间:2023-12-01 23:40:03 26 4
gpt4 key购买 nike

我正在尝试输入代码,以便在数据已存在于 sqlite 中时能够禁用该按钮。但我却发现了这个错误!你能帮我找到解决方案吗?

public boolean isExist(MovieFav movie) {
sqLiteDatabase = dbHelper.getReadableDatabase();
String QUERY = "SELECT * FROM " + TABLE_MOVIE + " WHERE " + _ID + "=" + movie.getTitle();

Cursor cursor = sqLiteDatabase.rawQuery(QUERY, null);
if (cursor.getCount() <= 0) {
cursor.close();
return false;
}
cursor.close();
return true;
}

这是我遇到的错误

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.submission4madegdk2019, PID: 16246 android.database.sqlite.SQLiteException: no such column: Joker (code 1): , while compiling: SELECT * FROM movie_favorites WHERE _id=Joker at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1392) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1331) at com.example.submission4madegdk2019.db.MovieFavHelper.isExist(MovieFavHelper.java:104) at com.example.submission4madegdk2019.activity.DetailMovieActivity.onClick(DetailMovieActivity.java:158) at android.view.View.performClick(View.java:6294) at android.view.View$PerformClick.run(View.java:24770) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

这是代码

@Override
public boolean onCreateOptionsMenu(Menu menu){
if (movieFavHelper.isExist(movieFav)){
btnSaveMov.setEnabled(false);
} else {
btnSaveMov.setEnabled(true);
}
return super.onCreateOptionsMenu(menu);
}

public void onClick(View view) {
if (view.getId() == R.id.btn_love) {

String titles = tv_title.getText().toString().trim();
String overview = tv_overview.getText().toString().trim();
String release_date = tv_release.getText().toString().trim();
String vote_average = tv_vote_average.getText().toString().trim();

String url_poster = tv_url_image.getText().toString().trim();

movieFav.setTitle(titles);
movieFav.setOverview(overview);
movieFav.setRelease_date(release_date);
movieFav.setVote_average(vote_average);
movieFav.setPoster_path(url_poster);

Intent intent = new Intent();
intent.putExtra(SEND_MOVIE_FAV, movieFav);
intent.putExtra(SEND_POSITION, position);


if (!isInsert) {
if (!movieFavHelper.isExist(movieFav)) {

long result = movieFavHelper.insertMovie(movieFav);

if (result > 0) {

setResult(RESULT_ADD, intent);
Toast.makeText(DetailMovieActivity.this, getString(R.string.success_add), Toast.LENGTH_SHORT).show();
finish();
} else {
btnSaveMov.setEnabled(false);
Toast.makeText(DetailMovieActivity.this, getString(R.string.failed_add), Toast.LENGTH_SHORT).show();
finish();
}

}
}
}
}

最佳答案

正确解释异常(即错误)详细信息至关重要。如果你做不到这一点,那么你就无法正确调试你的代码。异常详细信息的转储可能会变得困惑,但这里是关键点。请注意,异常类型和总体问题由

描述

android.database.sqlite.SQLiteException: no such column: Joker (code 1)

SQLite 期望找到一个名为 Joker 的列。但为什么?要回答这个问题,异常详细信息中还有另一条线索:

SELECT * FROM movie_favorites WHERE _id=Joker

其余的异常详细信息仅与代码跟踪有关,没有帮助,因为您已经知道有问题的代码。那么让我们看看导致问题的 SQL 的详细信息:

... WHERE _id=Joker

SQLite 会将 Joker 解释为一列,因为它不像字符串那样用引号括起来。但由于它不是表中的列,SQLite 不知道 Joker 是什么。它不知道您的意思是匹配电影名称。实际上,字符串应该用引号括起来,例如 'Joker' 以便 SQLite 知道它是一个字符串。

如果我们进一步分析它,我们会发现它正在尝试将名为 _id 的列与电影的名称进行比较。但大多数时候(除了奇怪的情况之外,总是如此),像 _id 这样的名称是一个整数主键。我的猜测是这个查询完全比较了错误的列。这里只是对正确的 SQL 应该是什么样子的猜测...只是猜测:

SELECT * FROM movie_favorites WHERE movie_title = 'Joker'

要获得该结果,您需要修复现有代码以包含正确的列并将 movie.getTitle() 括在引号中...

或者

更好的是使用适当的SQL 查询参数(准备好的语句)来避免 SQL 注入(inject)和其他错误...例如移动标题包含引号。如何做到这一点无法在这里回答,因为完整的教程超出了这个问题的范围,但可以通过在其他地方搜索“如何在 java 中使用 sql 参数”来发现它。

修复此错误后,按钮代码可能会正常工作。但如果没有,那么您需要单独研究该错误,并可能提出一个新问题。

关于java - 如何识别SQLite数据库查询异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58264035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com