2013-07-01 11 views
0

形式的GUID我有一個iOS項目和數據寫入SQLite數據庫。例如,表中的LDOCLINK存儲有關鏈接文檔的信息。查詢SQLite數據庫的形式X'3D98F71F3CD9415BA978C010b1CEF941

OBJECTROWID以格式<3d98f71f 3cd9415b a978c010 b1cef941>作爲字符串開始,但在輸入數據庫之前轉換爲(NSData *)。數據庫插入的實際處理是由一位比我有經驗的程序員編寫的。無論如何,如下圖所示,數據庫以X'3D98F71F3CD9415BA978C010b1CEF941'的形式顯示OBJECTROWID列。我是一個有SQLite查詢的完全初學者,似乎無法通過使用OBJECTROWID =OBJECTROWID like中的WHERE子句返回正確的行。

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管理器)。

我也檢出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; 
} 
} 
+0

後使用這些值寫入數據庫的代碼。這將使解釋如何扭轉過程變得更容易。 – rmaddy

+0

該模式可能有所幫助:'select * from sqlite_master where name ='LDOCLINK'and 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)。如果你使用參數,你可以在[sqlite3_bind_blob](http://www.sqlite.org/c3ref/bind_blob.html)中使用一個16字節的數組。 –

+0

@CL。謝謝,我現在用'SELECT * FROM LDOCLINK WHERE OBJECTROWID =?'和我的項目中的一個方法完成了一個我感興趣的'OBJECTROWID'數組。 –