我有一个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';

10-04 15:41