Kakao

2009-03-05 8 views
1

içinde bir dize oluştururken tek alıntı kullanma SQLite için FMDB sarmalayıcılarına geçirilecek bir SQL deyimi olarak kullanılmak üzere bir kakao oluşturmaktayım; Ancak, veritabanı bir BAD_ACCESS hatasıyla gider. Aşağıdaki kod var:Kakao

prefix = @ "SELECT * FROM Table WHERE Field1 LIKE '%";

middle = @ "% 'OR Field2 LIKE'%";

suffix = @ "% 'ORDERY BY";

orderby = @ "% 'ORDER BY FieldNames";

sqlStatement = [NSString stringWithFormat: @ "% @% @% @% @% @% @", önek, searchString, middle, searchString, suffix, orderby]; Tablo GELEN

SEÇ * NEREDE FieldNames

TARAFINDAN Alan1 GİBİ \ '% A% \' YA Alanı2 GİBİ \ '% A% \' SİPARİŞ

: çalışma zamanı SQLStatement At

aşağıdaki gibi bir şey içeren biter Bazı sebeplerden dolayı veritabanına dizinin eklenmesini sağlayan bir \ 'eklenir.

Dizgimde \ nesnesinin nasıl görünmesini engelleyebilirim?

GÜNCELLEME: NSLog aracılığıyla Ben çıkışı benim değişken aşağıdaki olsun: SEÇ * FROM tablo WHERE Alanı1 LIKE 'OX1.87A8013DBD18F-1027' OR Alanı2 LIKE 'OX1.87A8013DBD18F-1027'ORDER TARAFINDAN AlanAdı.

Sorun, dizede% A kullanılarak görünüyor. SqlStatement değişkenini '% A%' içermesi zor olsa bile,% A bir bellek adresine veya başka bir şeye dönüştürülüyor gibi görünüyor. '% ABAP%' yaparsam çıktıyı 'OX1.87A8013DBD18F-1027BAP' gibi alırım. Dikkat% işaretini kaybediyorum.

+0

gibi bir veritabanından geçirmeniz gerekir. Hangi veritabanını hedefliyorsunuz? – jonnii

+0

Lütfen kodu doğru biçimlendirmek için orijinal gönderiyi düzenleyin. –

+0

Parametreleri kullanmanız gerekiyor. Mesajımı gör. – jonnii

cevap

0

Dize doğru yapılmış gibi görünüyor. Ben konsolunda aşağıdaki sonuç elde

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool* pool = [NSAutoreleasePool new]; 

    NSString* prefix = @"SELECT * FROM Table WHERE Field1 LIKE '%"; 

    NSString* middle = @"%' OR Field2 LIKE '%"; 

    NSString* suffix = @"%' ORDERY BY "; 

    NSString* orderby = @"%' ORDER BY Fieldnames"; 

    NSString* sqlStatement = [NSString stringWithFormat:@"%@%@%@%@%@%@", prefix, @"blah", middle, @"blah", suffix, orderby]; 

    NSLog(@"sqlStatement: %@", sqlStatement); 

    [pool drain]; 

    return 0; 
} 

: Ben kodu çalıştırırsanız

2009-03-05 08:04:29.734 Untitled[79999:813] sqlStatement: SELECT * FROM Table WHERE Field1 LIKE '%blah%' OR Field2 LIKE '%blah%' ORDERY BY %' ORDER BY Fieldnames 
+0

Değişkenimi NSLog üzerinden verdiğimde aşağıdakileri elde ediyorum: SELECT * FROM Tablo NEREDE Field1 LIKE 'OX1.87A8013DBD18F-1027' VEYA Field2 LIKE 'OX1.87A8013DBD18F-1027'ORDER BY Fieldname. Sorun aramaBilgi. Ama bu alanı NSLog üzerinden çıkardığımda iyi görünüyor. \ sadece hata ayıklayıcıda görünür. – radesix

+0

Kodunuzu b yerine bir A ile deneyin ve ne olduğunu görün. – radesix

4

Sana sqlite kullanmakta olduğunuz tahmin etmeye gidiyorum, bu durumda bunu yapmak istiyor biraz farklı. İlk önce bu soruyu oluşturarak başlayın:

SELECT * FROM Table WHERE Field1 LIKE ?001 OR Field2 LIKE ?002 ORDER BY Fieldnames 

? 000 sözdizimi parametreler içindir.

Ardından parametreleri bağlamak için sqlite3_bind_text kullanabilirsiniz:

sqlite3_bind_text(statement, 1, [@"%bar%" UTF8String], -1, SQLITE_STATIC); 
sqlite3_bind_text(statement, 2, [@"%foo%" UTF8String], -1, SQLITE_STATIC); 

Umarım bu doğru yönde işaret etmelidir.

0

"Çalışma zamanında" ile ne demek istiyorsun? Xcode hata ayıklayıcıda mı demek istiyorsun?

this problem hedefliyor gibi görünüyor.

ters eğik çizgi bulunan tek tırnak sadece Xcode ayıklayıcı pencerenin değişken özet sütununun içinde görünecek görünüyor. "sql" değerini incelenmesi elle gdb doğru biçimde ortaya koymaktadır:

(gdb) po state_code = 'XX'

ve NSLogging dize de dışarı bırakır T_STATE select * from sql ters eğik çizgi. Yani, tek tırnakların, sadece değişken görünümü için görüntülenmesi için nesneyi biçimlendiren Xcode işleminde bazı nedenlerinden kaçtığını söyleyebilirim. senin 'güncelleme' İlişkin

+0

O zaman neden BAD_ACCESS ile sqlite bombalanıyor? – radesix

2

:

O yani biçim belirteci olarak kullanılan oluyor "% A" benziyor

:

% A: 64-bit kayan nokta sayı (çift), Exponent

tanıtmak için büyük P kullanılarak ondalık noktasından önce 0X ve bir onaltılı rakam gelen bir bilimsel gösterimde baskılı

Bkz. String Programming Guide for Cocoa.

Neler oluyor? sqlStatement dizesini daha sonra bir biçim denetimi dizesi olarak kullandığınız, bu da kötü. sqlStatement dizesini biçim belirteci olarak yorumlayan bir yönteme/işleve geçmeniz gerekiyorsa, bu iletiyi do_query(@"%@", sqlStatement)