2014-10-23 2 views
0

Я пытаюсь добавить некоторые данные из NSDictionary/NSArray в мою базу данных. Мой проект использует sqlite/FMDB для этого. Но я получаю некоторую проблему: я не могу сохранить NSData в моей базе данных.
Вот мой код:FMDB не вставляет NSData в таблицу

- (void)startSaveDB { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *path = [self databasePath]; 
    if ([fileManager fileExistsAtPath:path] == YES) { 
     FMDatabase *database = [FMDatabase databaseWithPath:path]; 
     if (database) { 
      [database open]; 
      [self createTableCacheApiWithDatabase:database]; 
      [self saveAPIwithJsonData:jsonData withParam:params withUrl:url withMethod:method withDatabase:database]; 
     } 
     [database close]; 
    } 
} 

Создать таблицу:

- (void)createTableCacheApiWithDatabase:(FMDatabase*)database { 
    [database executeUpdate:@"create table if not exists APIENGINE_CACHE_TABLE (idx INTEGER NOT NULL DEFAULT 0 PRIMARY KEY AUTOINCREMENT, url Varchar NOT NULL, method Varchar NOT NULL, date_modified Varchar NULL, param BLOB NOT NULL, data BLOB NOT NULL);"]; 
} 

Преобразование NSDictionary в NSData и сохранить:

- (void)saveAPIwithJsonData:(NSDictionary*)jsonData 
        withParam:(NSDictionary*)params 
        withUrl:(NSString*)url 
       withMethod:(NSString*)method 
       withDatabase:(FMDatabase*)database { 
    NSData *dataJson = [NSKeyedArchiver archivedDataWithRootObject:jsonData]; 
    NSData *dataParams = [NSKeyedArchiver archivedDataWithRootObject:params]; 
    if ([database open]) { 
     [database executeQuery:@"insert into APIENGINE_CACHE_TABLE (param, data, url, method) values (?, ?, ?, ?);", [NSData dataWithData:dataParams], [NSData dataWithData:dataJson], url, method]; 
    } 
} 

Путь:

- (NSString *) databasePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex: 0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME]; 
    NSLog(@"path: %@", path); 
    return path; 
} 

Wh at не так с моим кодом?

+0

Привет, я получаю ту же проблему, что вы нашли что-нибудь .. Пожалуйста, обновите. –

ответ

0

Его старый вопрос, но я случайно пришел к поиску решения проблемы. Ответ: FMDabatase связывает значения для объекта NSData. Таким образом, вы не можете использовать форматированную строку для вставки NSData. Скорее используйте запрос в формате (?,?,?). Если вы действительно хотите своего рода форматирование, вы можете использовать таким образом,

TABLE_USER, COL_CUSTOMER_ID, COL_IMAGE_PATH, COL_EXPIRY_DATE, COL_MOBILE_NUMBER определенные константы.

NSString * prepareStmt = [NSString stringWithFormat: 
        @"INSERT INTO %@ " 
        "(%@, %@, %@, %@) " 
        "VALUES (?, ?, ?, ?) ", 
        TABLE_USER, 
        COL_CUSTOMER_ID, 
        COL_IMAGE_PATH, 
        COL_EXPIRY_DATE, 
        COL_MOBILE_NUMBER]; 
    NSLog(@"Query: %@", prepareStmt); 
    BOOL res = [self.dbConnection executeUpdate:prepareStmt, 
       userInfo.customerId, 
       userInfo.imagePath, 
       userInfo.expiryDate, 
       userInfo.mobileNumber, nil]; 
+0

У вас есть синтаксис запроса обновления для типа blob? –

+0

Я не уверен прямо сейчас, но blob должен NSData, не так ли? – karim

Смежные вопросы