我试图键入代码,以便在数据已经在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:致命异常:主进程:com。实例提交文件4MadeGDK2019,PID:16246Android系统。数据库sqlite。SQLiteException:没有这样的专栏:Joker(代码1):,编译时:从android上的movie_favorites中选择*。数据库sqlite。SQLiteConnection。android上的nativePrepareStatement(本机方法)。数据库sqlite。SQLiteConnection。android上的acquirePreparedStatement(SQLiteConnection.java:890)。数据库sqlite。SQLiteConnection。在android上准备(SQLiteConnection.java:501)。数据库sqlite。SQLiteSession。在android上准备(SQLiteSession.java:588)。数据库sqlite。Sqlite程序。(SQLiteProgram.java:58)在android上。数据库sqlite。SQLiteQuery。(SQLiteQuery.java:37)在android上。数据库sqlite。SQLiteDirectCursorDriver。android上的查询(SQLiteDirectCursorDriver.java:46)。数据库sqlite。SQLITE数据库。android上的rawQueryWithFactory(SQLiteDatabase.java:1392)。数据库sqlite。SQLITE数据库。com上的rawQuery(SQLiteDatabase.java:1331)。实例提交文件4madegdk2019。db。电影摄影家。isExist(MovieFavHelper.java:104)位于com。实例提交文件4madegdk2019。活动详细的电影活动。Android上的onClick(DetailMovieActivity.java:158)。看法看法android上的performClick(View.java:6294)。看法查看$PerformClick。在android上运行(View.java:24770)。操作系统。汉德勒。android上的handleCallback(Handler.java:790)。操作系统。汉德勒。android上的dispatchMessage(Handler.java:99)。操作系统。活套。android上的loop(Looper.java:164)。应用程序。活动线程。java上的main(ActivityThread.java:6494)。朗,反思一下。方法在com上调用(本机方法)。Android内部的操作系统。RuntimeInit$MethodAndArgsCaller。在com上运行(RuntimeInit.java:438)。Android内部的操作系统。合子体。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数据库sqlite。SQLiteException:没有这样的专栏:小丑(代码1)
SQLite希望找到一个名为Joker的专栏。但为什么呢?要回答这个问题,在异常详细信息中还有另一条线索:
从电影收藏夹中选择*其中_id=Joker
其余的异常详细信息只是关于代码跟踪,没有帮助,因为您已经知道存在问题的代码。那么让我们来看一下导致问题的SQL的细节:
... WHERE _id=Joker
SQLite将把Joker
解释为一列,因为它不像字符串那样用引号括起来。但由于它不是表中的一列,SQLite不知道什么是Joker
。它不知道你的意思是匹配电影名称。实际上,字符串应该用引号括起来,比如'Joker'
,这样SQLite就知道它是一个字符串。
如果我们进一步分析它,就会发现它试图将名为\u id
的列与电影的名称进行比较。但是在大多数情况下(除了奇怪的情况),像\u id
这样的名字是一个整数主键。我猜这个查询完全是在比较错误的列。下面是正确的SQL应该是什么样子的猜测。。。只是猜测:
SELECT * FROM movie_favorites WHERE movie_title = 'Joker'
要获得这个结果,您需要修复现有代码以包含适当的列,并包装电影。getTitle()
在引号中。。。
或
更好的是使用适当的SQL查询参数(准备好的语句)来避免SQL注入和其他错误...比如移动标题包含引号。如何做到这一点在这里无法回答,因为完整的教程超出了这个问题的范围,但是可以通过在其他地方搜索“如何在java中使用sql参数”来发现。
一旦这个错误被修复,按钮代码就可以正常工作了。但如果没有,那么你可以单独研究这个bug,并可能提出一个新问题。
我有一个,我试图将其转换为String[],以便查询数据库,但我得到了,我不知道问题出在哪里? 将arraylist转换为String[]: 然后我使用游标查询: arraylist和String[]从索引0到34都必须有35个元素 我不明白问题出在哪里?
问题内容: 我是否需要为SQLite安装驱动程序,或者查询是否有问题? 该示例查询: 问题答案: 是的,您需要安装与数据库后端匹配的驱动程序。 关于“ BaseX ”的(非常好的)文档,在“ SQL模块”部分中 : 该模块使用JDBC连接到SQL Server。因此,您的JDBC驱动程序也需要添加到类路径中。如果使用BaseX的完整发行版,则可以将驱动程序复制到lib目录中。例如,要连接到MySQ
我一直在尝试一个应用程序,其中我使用AsyncTask从sqlite表中检索数据。它有时工作起来没有那么多问题。但是当它失败时,Logcat看起来像这样 07-24 16:06:20.477: E/AndroidRuntime(950): 致命异常: 异步任务 #1 07-24 16:06:20.477: E/AndroidRuntime(950): java.lang.RuntimeExcept
问题内容: 在我的SQLite数据库管理器中,我可以查询以下内容: 这个查询从2012年7月的名为“ tripmileagetable”的表中返回了里程表总和,但是我想在android查询中编写此代码。 但是我不知道如何在database.query()方法中建立此查询,有什么可以帮助吗? 问题答案:
我试图做的是查询并在游标中返回vehicle\u implement表中的所有列及其左侧的所有表,通过图中所示的外键连接。在vehicle\u implement中有一些null implement\u id,我仍然需要这些行。没有,也不会有任何空的vehicle\u id。我认为,当implement\u id为null时,可能无法从implement表左侧的表中返回任何内容,这会阻止我获取所需
在我的SQLite数据库管理器中,我可以查询以下内容: 此查询返回2012年7月名为“tripmileagetable”的表中里程表列的总和,但我想在android查询中编写此代码。 但是我不知道如何在database.query()方法中建立这个查询,有人能帮忙吗?