【发布时间】:2016-04-26 19:29:06
【问题描述】:
我已尝试使用准备好的语句和常规语句来使用长 iPhone 模拟器路径从我的表中检索记录。
我根本无法让使用 WHERE 语句中的字段 Path 的 SELECT 语句工作。如果我删除 WHERE 语句,它会返回记录。
例如
Last Added[/Users/admin/Library/Developer/CoreSimulator/Devices/1546523B-D9E4-45F6-9ACA-ADA5CF73DFE4/data/Containers/Data/Application/9187662E-16F3-4573-B486-256BDA00CBD1/Documents/wf_mages-3.lha]
SQL[SELECT ID FROM Tune WHERE Path="/Users/admin/Library/Developer/CoreSimulator/Devices/1546523B-D9E4-45F6-9ACA-ADA5CF73DFE4/data/Containers/Data/Application/9187662E-16F3-4573-B486-256BDA00CBD1/Documents/wf_mages-3.lha"]
我在查询中尝试了双引号和单引号。我什至在 SQLiteBrowser 中尝试过相同的查询,效果很好。
SELECT ID FROM Tune WHERE Path LIKE '%mages%' 工作正常。
是正斜杠的问题还是路径值的大小有问题?是否需要以某种方式转义正斜杠?
我能找到的唯一一篇关于正斜杠的帖子建议使用准备好的语句,但这就是我最初的开始,它们不起作用。查找在我的表中的任何其他字段上都可以正常工作 - 只是路径不行。
int GetTuneIDWithPath( char *pszPath )
{
// TEST
char txTmp [ 1024 ];
sprintf( g_txSQL, "SELECT %s", fldTune_ID );
sprintf( txTmp, " FROM %s ", tbTune );
strcat( g_txSQL, txTmp );
//sprintf( txTmp, " WHERE %s=\"%s\"", fldTune_Path, pszPath );
//strcat( g_txSQL, txTmp );
// sprintf( txTmp, " WHERE %s='%s'", fldTune_Path, pszPath );
//strcat( g_txSQL, txTmp );
//sprintf( txTmp, " WHERE %s LIKE '%%mages%%'", fldTune_Path );
//strcat( g_txSQL, txTmp );
LogDebugf( "SQL[%s]", g_txSQL );
char *zErrMsg = 0;
char **pszResult;
int nRows;
int nCols;
int rc;
rc = sqlite3_get_table_wrapper( g_MainDB,
g_txSQL,
&pszResult,
&nRows,
&nCols,
&zErrMsg );
if( nRows != 1 )
{
LogDebugf( "FAILED nRows: %d", nRows );
return FALSE;
}
// First row is field names, so start at 1
int nCol = 0;
int nID = Safe_atoi( pszResult[ nCols + nCol ] ); nCol ++;
LogDebugf( "PDS> nID: %d Find[%s]", nID, pszPath );
return nID;
}
在此之前,我确实尝试过使用准备好的语句,就像我对其他查询所做的那样:
char txTmp [ 1024 ];
sprintf( g_txSQL, "SELECT %s", fldTune_ID );
sprintf( txTmp, " FROM %s WHERE %s=?", tbTune, fldTune_Path );
strcat( g_txSQL, txTmp );
sqlite3_stmt *stmt = NULL;
sqlite3_prepare( g_MainDB, g_txSQL, -1, &stmt, NULL );
sqlite3_reset( stmt );
sqlite3_bind_text( stmt, 1, pszPath, strlen( pszPath ), SQLITE_STATIC );
rc = sqlite3_step( stmt );
if( rc != SQLITE_ROW )
{
LogDebugf( "PDS> Lookup failed [%s] rc: %d", pszPath, rc );
return FALSE;
}
int nID = sqlite3_column_int( stmt, 0 );
LogDebugf( "PDS> nID: %d Find[%s]", nID, pszPath );
【问题讨论】:
-
@CL - 添加了一些代码。
标签: iphone sqlite ios-simulator