0

iOS プロジェクトがあり、データは SQLite データベースに書き込まれます。たとえば、リンクされたドキュメントに関する情報を 'OBJECTROWID'テーブルに格納します。LDOCLINK

OBJECTROWID形式の文字列として始まりますが、データベースに入力される前に<3d98f71f 3cd9415b a978c010 b1cef941>キャストされます。(NSData *)データベース挿入の実際の処理は、私よりもはるかに経験豊富なプログラマーによって作成されました。とにかく、下の画像が示すように、データベースはOBJECTROWID列をフォームに表示しますX'3D98F71F3CD9415BA978C010b1CEF941'。私は SQLite クエリの完全な初心者であり、 orWHERE句を使用して正しい行を返すことができないようです。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>%'

頭文字などの 2 つの隣接する文字の一致さえ取得できません3D

SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%3d%'エラーは報告されませんが、何も返されません。

SELECT * FROM LDOCLINK WHERE OBJECTROWID like '%d%'これは、 my を含まない 2 つの行のみを返すため<3d98f71f 3cd9415b a978c010 b1cef941>、一見恣意的に見えるため、最も奇妙な結果です。

SELECT * FROM LDOCLINK WHERE OBJECTTYPE = '0'インターフェイスが機能することを示すために、これらと同じ行を返します (SQLite Manager)。

this question とthis oneもチェックアウトしましたが、まだ正しいクエリを取得できませんでした。

正しい行を返すのを手伝ってください (この場合、実際には 2 行 - 1 番目と 3 番目)。

編集:

データベースに書き込むコードには、多くのクラスが含まれます。以下に示す方法が、連載のメイン部分だと思います(ケース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