2013-07-01 7 views
0

У меня есть проект iOS, и данные записываются в базу данных SQLite. Например, 'OBJECTROWID' в таблице LDOCLINK хранит информацию о связанном документе.Запросить базу данных SQLite для GUID в форме X'3D98F71F3CD9415BA978C010b1CEF941

OBJECTROWID начинается с строки <3d98f71f 3cd9415b a978c010 b1cef941>, но передается в (NSData *) перед входом в базу данных. Фактическая обработка вставки базы данных была написана гораздо более опытным программистом, чем я. В любом случае, как показано на рисунке ниже, база данных отображает столбец OBJECTROWID в форме X'3D98F71F3CD9415BA978C010b1CEF941'. Я полный новичок с SQLite-запросами и не могу возвращать правильную строку, используя предложение WHERE с OBJECTROWID = или OBJECTROWID like.

enter image description here

enter image description here

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 один, но я все еще не смог получить правильный запрос.

Пожалуйста, помогите мне вернуть правильную строку (на самом деле две строки в этом случае - первая и третья).

EDIT:

Код для записи в базу данных включает в себя множество классов. Метод, показанный ниже, я считаю основной частью сериализации (случай 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; 
} 
} 
+0

Post код, используемый для записи этих значений в базе данных.Это упростит объяснение того, как изменить процесс. – rmaddy

+0

Схема может помочь: 'select * from sqlite_master, где name = 'LDOCLINK' и type = 'table';' –

+0

@rmaddy. Благодарю. Я разместил некоторые, надеюсь, это поможет. –

ответ

1

Таким образом, как отметил Том Керр, this пост ответил на мой вопрос. Почти. Синтаксис не совсем правильный. Была предложена форма: SELECT * FROM LDOCLINK WHERE OBJECTROWID.Id = X'a8828ddfef224d36935a1c66ae86ebb3';, но мне действительно пришлось отказаться от части .Id.

Изготовление:

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

+1

Это [BLOB-буква] (http://www.sqlite.org/lang_expr.html#litvalue). Если вы используете параметры, вы можете использовать 16-байтовый массив с [sqlite3_bind_blob] (http://www.sqlite.org/c3ref/bind_blob.html). –

+0

@CL. Спасибо, я сделал это сейчас, используя 'SELECT * FROM LDOCLINK WHERE OBJECTROWID =?' И метод в моем проекте, которому я передаю массив 'OBJECTROWID', который меня интересует. –