【问题标题】:Android SQLite DELETE failureAndroid SQLite DELETE 失败
【发布时间】:2023-04-09 05:53:01
【问题描述】:

我有一个应用程序,它显示来自 SQLite 数据库内容的 ListView。当我单击 ListView 中的一个项目时,我向我的 JNI 线程发布一条消息,并尝试对同一数据库中的表执行 DELETE 命令,但它与 ListView 访问的表完全不同。

很遗憾,sqlite3_finalize() 调用失败,错误代码为 1 (SQL_ERROR)。

我怀疑这是因为数据库已被 SimpleCursorAdapter 打开(或仍然打开?)。会是这样吗?

当我在 Firefox 的 SQLiteManager(我在数据库副本上测试所有 SQLite 语句)中尝试时,DELETE 语句本身可以完美运行。 UPDATE 命令似乎和任何 SELECT 命令都可以正常工作 - 它只是 DELETE 不起作用。

当 SimpleCursorAdapter 完成显示行时,我是否需要手动关闭它?我正在使用 LoaderManager 来维护数据内容。

JNI 执行代码如下:

BOOL ExecuteSQL( char *pszSQL )
{
  sqlite3_stmt *pStmt;
  int           rc;

  rc = sqlite3_prepare_v2( g_MainDB, 
                           pszSQL, 
                           -1, 
                           &pStmt, 
                           0 );
  int nFailStep = 0;

  if( rc == SQLITE_OK )
    rc = sqlite3_step( pStmt );
  else
    nFailStep = 1;

  if( rc == SQLITE_OK )
    rc = sqlite3_finalize( pStmt );
  else
    nFailStep = 2;

  if( ( rc == SQLITE_OK ) || ( rc == SQLITE_DONE ) )
    return TRUE;
  else
    nFailStep = 3;

  LogDebugf( "ExecuteSQL: rc: %d (%s) nFailStep: %d\n", rc, sqlite3_errstr( rc ), nFailStep );

  return FALSE;
}

它失败了:

ExecuteSQL: rc: 1 (SQL logic error or missing database) nFailStep: 3

【问题讨论】:

  • 您的代码有问题。您还没有显示。
  • @CL。它有大量的代码要显示。您会对哪些部分感兴趣?
  • sqlite3_*finalize 之前调用。
  • @CL.: 我已经用那段代码更新了这个问题。
  • @CL。这是我不应该使用 prepare 和 step 并且可能应该使用 sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) 的情况之一吗?我会试试这个以防万一..

标签: android sqlite android-listview java-native-interface simplecursoradapter


【解决方案1】:

整个nFailStep 逻辑大错特错;该值不太可能是正确的。 此外,如果sqlite3_step 成功,该代码不会调用sqlite3_finalize。 此外,您可以使用sqlite3_errmsg 获得更好的错误消息:

BOOL ExecuteSQL(const char *pszSQL)
{
    sqlite3_stmt *stmt;
    int rc;

    rc = sqlite3_prepare_v2(g_MainDB, pszSQL, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        LogDebugf("ExecuteSQL: prepare failed: %s\n", sqlite3_errmsg(g_MainDB));
        return FALSE;
    }
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
        LogDebugf("ExecuteSQL: step failed: %s\n", sqlite3_errmsg(g_MainDB));
        sqlite3_finalize(stmt);
        return FALSE;
    }
    sqlite3_finalize(stmt);
    return TRUE;
}

【讨论】:

  • 谢谢,但它仍然失败。我也尝试了 sql_exec() 本身,我得到了与你的代码相同的错误。我将我的 SQL 命令和结果添加到问题中..
  • 我发现问题了!我的 SQL 语句中缺少一个圆括号。不敢相信我错过了!
  • 我会接受你的回答,因为它确实记录了语法错误而我的代码没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2021-12-04
相关资源
最近更新 更多