2011-04-14 104 views
0

我創造我在哪裏使用SQLite數據庫來保存data.But當我運行我的應用程序的應用程序,我得到了以下錯誤:得到錯誤,而試圖獲取和數據插入到SQLite數據庫

@interface TDatabase : NSObject { 
    sqlite3 *database; 
} 

+(TDatabase *) shareDataBase; 

-(BOOL) createDataBase:(NSString *)DataBaseName; 

-(NSString*) GetDatabasePath:(NSString *)database; 

-(NSMutableArray *) getAllDataForQuery:(NSString *)sql forDatabase:(NSString *)database; 
-(void*) inseryQuery:(NSString *) insertSql forDatabase:(NSString *)database1; 

@end 

#import "TDatabase.h" 
#import <sqlite3.h> 

@implementation TDatabase 

static TDatabase *SampleDataBase =nil; 

+(TDatabase*) shareDataBase{ 

    if(!SampleDataBase){ 
     SampleDataBase = [[TDatabase alloc] init]; 
    } 

    return SampleDataBase; 
} 

-(NSString *)GetDatabasePath:(NSString *)database1{ 

    [self createDataBase:database1]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:database1]; 

} 

-(BOOL) createDataBase:(NSString *)DataBaseName{ 

    BOOL success; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DataBaseName]; 

    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) return success; 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DataBaseName]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 

    if (!success) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!!!" message:@"Failed to create writable database" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 

    } 
    return success; 
} 


-(NSMutableArray *) getAllDataForQuery:(NSString *)sql forDatabase:(NSString *)database1{ 

    sqlite3_stmt *statement = nil ; 

    NSString *path = [self GetDatabasePath:database1]; 

    NSMutableArray *alldata; 
    alldata = [[NSMutableArray alloc] init]; 

    if(sqlite3_open([path UTF8String],&database) == SQLITE_OK) 
    { 
     NSString *query = sql; 

     if((sqlite3_prepare_v2(database,[query UTF8String],-1, &statement, NULL)) == SQLITE_OK) 
     { 
      while(sqlite3_step(statement) == SQLITE_ROW) 
      { 

       NSMutableDictionary *currentRow = [[NSMutableDictionary alloc] init]; 

       int count = sqlite3_column_count(statement); 

       for (int i=0; i < count; i++) { 

        char *name = (char*) sqlite3_column_name(statement, i); 
        char *data = (char*) sqlite3_column_text(statement, i); 

        NSString *columnData; 
        NSString *columnName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; 


        if(data != nil) 
         columnData = [NSString stringWithCString:data encoding:NSUTF8StringEncoding]; 
        else { 
         columnData = @""; 
        } 

        [currentRow setObject:columnData forKey:columnName]; 
       } 

       [alldata addObject:currentRow]; 
      } 
     } 
     sqlite3_finalize(statement); 
    } 
    sqlite3_close(database); 

    return alldata; 

} 


-(void*) inseryQuery:(NSString *) insertSql forDatabase:(NSString *)database1{ 

    sqlite3_stmt *statement = nil ; 

    NSString *path = [self GetDatabasePath:database1]; 

    if(sqlite3_open([path UTF8String],&database) == SQLITE_OK) 
    { 
     if((sqlite3_prepare_v2(database,[insertSql UTF8String],-1, &statement, NULL)) == SQLITE_OK) 
     { 
      if(sqlite3_step(statement) == SQLITE_OK){ 
      } 
     } 
     sqlite3_finalize(statement); 
    } 
    sqlite3_close(database); 

    return insertSql; 
} 



NSString *sql = @"select * from Location"; 
const location = [[TDatabase shareDataBase] getAllDataForQuery:sql forDatabase:@"journeydatabase.sqlite"];//1 

NSString* insertSql = [NSString stringWithFormat:@"insert into Location values ('city','name','phone')"];//2 
const insert =[[TDatabase shareDataBase] inseryQuery:insertSql forDatabase:@"journeydatabase.sqlite"];//3 

在行號1,2,3我得到相同的錯誤:「初始化元素不是常量」

可能是什麼問題。請任何人都幫我解決這個問題。 謝謝

+0

看看這個鏈接是否有幫助。 http://stackoverflow.com/questions/459530/objective-c-error-initializer-element-is-not-constant/459611#459611。 – EmptyStack 2011-04-14 07:14:47

回答

0

@rani寫你自己的方法來處理sqlite數據庫是非常辛苦的。您應該使用fmdb包裝類或使用核心數據。我個人比較喜歡fmdb。起初我的方式和你一樣。我在這裏找到關於fmdb的信息。使用它後,我必須編寫非常少的代碼,每當我必須處理sqlite數據庫。