2015-01-28 2 views
-1

iOS 앱의 SQLite 데이터베이스에 일부 데이터를 저장하려고합니다. 나는 아래의 방법으로이 일을 해요 :SQLite 데이터베이스가 올바르게 작동하지 않습니다.

NSString *query = [NSString stringWithFormat:@"INSERT INTO categories VALUES ('%@', '%@', '%@', null, %d)", categoryName, @"test", @"test", 33]; 

NSLog(@"Query is: %@", query); 

[[AFSQLManager sharedManager]performQuery:query withBlock:^(NSArray *row, NSError *error, BOOL finished) { 

    if (!error) { 

     if (!finished) { 
      NSLog(@"No success"); 
     } else { 
      NSLog(@"Succeeded"); 
     } 
    } else { 

     UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Oops" message:error.description delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
        [alertView show]; 
    } 
}]; 

그리고 이것은 viewDidLoad에서 실행되는 데이터베이스 여는 방법 : 당신이 볼 수 있듯이, 내가 AFSQLManager을 사용하고

[[AFSQLManager sharedManager]openLocalDatabaseWithName:@"test.sqlite" andStatusBlock:^(BOOL success, NSError *error) { 
    if (error) { 
     UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Oops" message:error.description delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alertView show]; 
    } 
}]; 

을 쿼리를 실행하기 위해 (여기서 찾을 수 있습니다 https://github.com/AlvaroFranco/AFSQLManager). 위의 방법은 '성공'을 기록하지만 데이터베이스에서 일부 데이터를 가져올 때 결과가 없습니다. 내 최고의 추측은 SQLite 데이터베이스에 문제가 있다는 것입니다 ... 내가 뭘 잘못하고 있는지 아는 사람이 있습니까?

+1

제쳐두고'stringWithFormat'으로 SQL을 빌드하면 안됩니다. 당신은 SQL에'? '자리 표시자를 사용하고 그 자리 표시 자에 값을 바인딩해야합니다. 나는 AFSQLManager가 그렇게 할 수 없다고 생각한다. 그래서 당신은 그 기능을 제공하는 [FMDB] (https://github.com/ccgus/fmdb)와 같은 라이브러리를 사용할 것을 고려할 것이다. – Rob

+0

10 번 중 9 번 증상은 데이터베이스 파일이 실제로 있어야하는 위치 또는 생각한 위치에 있지 않기 때문입니다. –

답변

0

당신이 참조하는 클래스는 번들에서 데이터베이스를 엽니 다 즉 것을, 개장 루틴에서 상당히 근본적인 문제가 있습니다

-(void)openLocalDatabaseWithName:(NSString *)name andStatusBlock:(statusBlock)status { 

    NSString *path = [[NSBundle mainBundle]pathForResource:[[name lastPathComponent]stringByDeletingPathExtension] ofType:[name pathExtension]]; 

    if (sqlite3_open([path UTF8String], &_database) != SQLITE_OK) { 
     NSLog(@"Failed to open database!"); 
     status(NO, nil); 
    } else { 
     NSLog(@"Database opened properly"); 
     status(YES, nil); 
    } 
} 

번들은 읽기 전용입니다. 따라서 해당 데이터베이스의 데이터를 업데이트하려는 시도는 실패합니다.

업데이트하려면 문서 폴더 (또는 캐시 또는 임시 폴더 또는 기타)에 데이터베이스를 복사하거나 데이터베이스에 복사해야합니다.

+0

알았어, 그건 의미가있다. 이것은 약간 주제가 될 수 있지만 더 나은 수업을 알고 있습니까? – user4486205

+0

FMDB (https://github.com/ccgus/fmdb) – Rob

관련 문제