【发布时间】: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