2014-02-25 1 views
0

내 iPHone 응용 프로그램에서 NSArray를 이와 같은 sqlite에 저장하고 있습니다.SQLite에 NSArray 저장 및 검색

-(void)saveData 

NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:MyArray]; 



    sqlite3_stmt *statement; 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
    { 
     NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO ARRAY(PROFILE) VALUES (\"%@\")",dataFromArray]; 


    const char *insert_stmt = [insertSQL UTF8String]; 
    sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); 
    if (sqlite3_step(statement) == SQLITE_DONE) 
    { 
     NSLog(@"Saved Succesfully"); 

     } 
    else { 
     // NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(contactDB)); 
     NSLog(@"Not saved %d",sqlite3_finalize(statement)); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(contactDB); 
    } 

    } 

데이터가 성공적으로 저장되었습니다.

는 지금은 this-

-(void)fetchData{ 

    const char *dbpath = [databasePath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
    { 
    NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM ARRAY"]; 
    const char *query_stmt = [querySQL UTF8String]; 

    if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
    { 
     while(sqlite3_step(statement) == SQLITE_ROW) 
     { 
      NSString *MYstring = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 


      NSData* data = [MYstring dataUsingEncoding:NSUTF8StringEncoding]; 

      NSLog(@"data---%@",data); 


      NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 



      } 
      sqlite3_finalize(statement); 
     } 
      sqlite3_close(contactDB); 
     } 

    } 

나는이

<62706c69 73743030 d4000100 02000300 04000500 0806cb06 cc542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d100 06000754 726f6f74 8001af11 022a0009 000a0017 00180019 001a0080 00810082 00830084 00850086 00870088 0089008a 008b008c 008d008e 008f0090 00910092 00930094 00950096 00970098 0099009a 009b009c 009d009e 009f00a0 00a100a2 00a300a4 00a500a6 00a700a8 00a900aa 00ab00ac 00ad00ae 00af00b0 00b100b5 00bd00c0 00c300c6 00c900cc 00cf00d2 00d500d8 00db00de 00e100e4 00e700ea 00ed00f0 00fd0105 0108010b 010e0111 01140117 011a011d 01200122 0127012a 012d0130 01330136 0139013c 013f0142 01450148 014b014e 01510154 0159015e 01610164 0169016f 018101a1 01a201a3 01a401a5 01a601a7 01a801a9 01aa01ab 01ac01ad 01ae01af 01b201b5 01b801bb 01be01c1 01c401c7 01ca01cd 01d001d3 01d601d9 01f901fa 01fb01fc> 

처럼 "mystring에"대한 인쇄 값을 받고하지만 데이터에서있는 NSArray를 만들 때 사용하고 같은 저장된 데이터를 가져 오기 위해 시도 NSKeyedUnarchiver -이 오류를 표시하는 응용 프로그램이 손상되었습니다.

-[__NSCFData objectForKey:]: unrecognized selector sent to instance 

어디서 실수를하고 있습니까? 저장된 배열을 검색하는 데 도움을주십시오. 미리 감사드립니다.

+0

데이터를 다른 개체 유형으로 다시 변환해야합니다. '- [__ NSCFData objectForKey :] : 인스턴스로 보낸 인식 할 수없는 선택자 '는 NSData 객체에서'objectForKey' 메소드를 사용했다는 것을 알려줍니다. 아마 NSDictionary로 필요할 것입니다. – mah

+0

NSLog ("% @", dataFromArray);를 실행하고 이스케이프 처리되지 않은 따옴표를 계산하십시오. –

+0

위의 "인식 할 수없는 선택기"예외는 어디에서 왔습니까? 귀하의 업체 정보에서 색인을 생성하려고하지 않습니다. 'myArrayFromDB'에 대한 색인을 생성 중이거나'data' 색인을 생성하고 있습니까? –

답변

0

왜 NSData를 사용합니까? 문자열이 수신되면 아래 라인에 기입하십시오

NSArray *myArrayFromDB = [MYstring componentsSeparatedByString:@","]; 

작동하는 경우 시도해보십시오. 그렇지 않다면 알려주세요. 다른 솔루션을 찾았습니다.

+0

아니요 데이터 형식의 문자열을 가져 오는 중 –

+0

대답을 편집합니다 – Funny

+0

배열 값에 쉼표가 포함되어 있지 않은 경우 가장 쉬운 방법 일 수 있습니다. – Hemang

0

이렇게하면 myArray의 XML 표현이 만들어지고 dataFromArray에 배치됩니다. 이 같은 것은 :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> 
<plist version="1.0"> 
<array> 
    <string>It is a tale told by an idiot,</string> 
    <string>Full of sound and fury, signifying nothing.</string> 
</array> 
</plist> 

XML은 NSTF8 형식으로 변환되어 NSData 객체에 저장됩니다.

은 당신이 할 경우 :

NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO ARRAY(PROFILE) VALUES (\"%@\")",dataFromArray]; 

stringWithFormat 작업은 형식 문자열을 해석합니다. %@을 보면 "매개 변수 목록에서 다음 객체 참조를 가져 와서 description 메서드를 적용한 다음 문자열에 배치해야합니다."라고 생각합니다.

NSData의 description 메서드는 <?xml version... 데이터를 취하여 표시 할 수있는 16 진수로 변환합니다 (description은 완전히 "실제"코드가 아닌 디버깅을 위해 사용되기 때문에). 표시 할 수있는 16 진수는 공백으로 구분되고 "<>"문자로 묶인 8 자 그룹으로 지정됩니다. 지금까지 데이터는 절망적으로 왜곡되어 있으며 DB에 아직 삽입하지 않았습니다.