0

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

给出所有行(显然),但我想要OBJECTROWIDequals的行<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;
}
}
4

1 回答 1

1

所以,正如 Tom Kerr 所指出的,这篇文章回答了我的问题。几乎。语法并不完全正确。形式:SELECT * FROM LDOCLINK WHERE OBJECTROWID.Id = X'a8828ddfef224d36935a1c66ae86ebb3';被建议但我实际上不得不放弃这.Id部分。

制造:

SELECT * FROM LDOCLINK WHERE OBJECTROWID = X'3d98f71f3cd9415ba978c010b1cef941';

于 2013-07-01T23:18:36.420 回答