我有一个iOS项目,数据已写入SQLite数据库。例如,表'OBJECTROWID'
中的LDOCLINK
存储有关链接文档的信息。OBJECTROWID
以格式为<3d98f71f 3cd9415b a978c010 b1cef941>
的字符串开头,但在输入数据库之前被强制转换为(NSData *)
。数据库插入的实际处理是由比我本人更有经验的程序员编写的。无论如何,如下图所示,数据库以OBJECTROWID
形式显示X'3D98F71F3CD9415BA978C010b1CEF941'
列。我是SQLite查询的完整入门者,似乎无法通过将WHERE
子句与OBJECTROWID =
或OBJECTROWID like
一起使用来返回正确的行。SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%';
给出所有行(显然),但是我要OBJECTROWID
等于<3d98f71f 3cd9415b a978c010 b1cef941>
的行。我尝试了以下方法,但没有一个起作用:SELECT * FROM LDOCLINK WHERE OBJECTROWID = 'X''3d98f71f3cd9415ba978c010b1cef941'
没有错误-我以为我转义了X后面出现的单引号,但是这行不通SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%<3d98f71f 3cd9415b a978c010 b1cef941>%'
我什至无法找到两个相邻字符(例如初始3D
)的匹配项:SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%3d%'
没有报告错误,但不返回任何内容。SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%d%'
这是最奇怪的结果,因为它似乎只返回不包含我的<3d98f71f 3cd9415b a978c010 b1cef941>
的两行。SELECT * FROM LDOCLINK WHERE OBJECTTYPE = '0'
返回这些相同的行,只是为了说明该接口有效(SQLite Manager)。
我还签出了this问题和this一个问题,但仍然无法获得正确的查询。
请帮助我返回正确的行(在这种情况下,实际上是两行-第一和第三行)。
编辑:
写入数据库的代码涉及许多类。我认为以下所示的方法是序列化的主要部分(案例8)。
-(void)serializeValue:(NSObject*)value ToBuffer:(NSMutableData*)buffer
{
switch (self.propertyTypeID) {
case 0:
{
SInt32 length = 0;
if ( (NSString*)value )
{
/*
NSData* data = [((NSString*)value) dataUsingEncoding:NSUnicodeStringEncoding];
// first 2 bytes are unicode prefix
length = data.length - 2;
[buffer appendBytes:&length length:sizeof(SInt32)];
if ( length > 0 )
[buffer appendBytes:([data bytes]+2) length:length];
*/
NSData* data = [((NSString*)value) dataUsingEncoding:NSUTF8StringEncoding];
length = data.length;
[buffer appendBytes:&length length:sizeof(SInt32)];
if ( length > 0 )
[buffer appendBytes:([data bytes]) length:length];
}
else
[buffer appendBytes:&length length:sizeof(SInt32)];
}
break;
//depends on the realisation of DB serialisation
case 1:
{
Byte b = 0;
if ( (NSNumber*)value )
b = [(NSNumber*)value boolValue] ? 1 : 0;
[buffer appendBytes:&b length:1];
}
break;
//........
case 8:
{
int length = 16;
[buffer appendBytes:[(NSData*)value bytes] length:length];
}
break;
default:
break;
}
}
最佳答案
因此,正如汤姆·克尔(Tom Kerr)所指出的,this帖子回答了我的问题。几乎。语法不完全正确。建议使用形式:SELECT * FROM LDOCLINK WHERE OBJECTROWID.Id = X'a8828ddfef224d36935a1c66ae86ebb3';
,但实际上我必须删除.Id
部分。
制造:SELECT * FROM LDOCLINK WHERE OBJECTROWID = X'3d98f71f3cd9415ba978c010b1cef941';