我有一个 iOS 项目,数据被写入 SQLite 数据库。例如,'OBJECTROWID'
在表格中LDOCLINK
存储有关链接文档的信息。
OBJECTROWID
以具有格式的字符串开头,<3d98f71f 3cd9415b a978c010 b1cef941>
但(NSData *)
在输入数据库之前被转换为。数据库插入的实际处理是由比我更有经验的程序员编写的。无论如何,如下图所示,数据库OBJECTROWID
以 形式显示列X'3D98F71F3CD9415BA978C010b1CEF941'
。我是 SQLite 查询的完整初学者,似乎无法通过使用带有or的WHERE
子句返回正确的行。OBJECTROWID =
OBJECTROWID like
SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%';
给出所有行(显然),但我想要OBJECTROWID
equals的行<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%'
这是最奇怪的结果,因为它只返回不包括 my 的两行<3d98f71f 3cd9415b a978c010 b1cef941>
,看似任意。
SELECT * FROM LDOCLINK WHERE OBJECTTYPE = '0'
返回这些相同的行,只是为了说明接口工作(SQLite 管理器)。
请帮助我返回正确的行(在这种情况下实际上是两行 - 第一行和第三行)。
编辑:
写入数据库的代码涉及许多类。下面显示的方法是我认为序列化的主要部分(案例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;
}
}