2013-12-19 59 views
1

我無法在我的文檔目錄中創建sqlite數據庫。 下面是代碼:在iOS中創建Sqlite數據庫

NSString *fileDir; 
    NSArray *dirPaths; 


//Get the documents directory 

dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask, YES); 

fileDir = [dirPaths objectAtIndex:0]; 

// Build the database path 
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sql"]]; 

NSFileManager *fileMgr = [NSFileManager defaultManager]; 

    if([fileMgr fileExistsAtPath:databasePath] == NO) 
    { 
     const char *dbPath = [databasePath UTF8String]; 

     if (sqlite3_open(dbPath, &database) == SQLITE_OK) 
     { 
      char *errMsg; 
      const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS(ID INTEGER PRIMARY KEY , NAME TEXT, ADDRESS TEXT, MOBILE INTEGER)"; 
      if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { 
       _status.text = @"Failed to create table";     
      } 
      sqlite3_close(database); 

     } 
     else 
     { 

      _status.text = @"Failed to open/create database"; 
     } 
    } 

我有調試代碼,發現編譯器是不是在此條件下持續。 sqlite3_open(dbPath,& database)== SQLITE_OK

我不知道我在做什麼錯。 任何幫助將不勝感激...

感謝,

+0

呃,有什麼返回代碼*爲* sqlite3_open返回常見的方法是什麼? sqlite3_errmsg報告什麼? –

+0

(順便說一句,假設你真的在「調試」以找出它失敗的地方,編譯器不參與。) –

+0

我認爲你必須改變文件擴展名,即student.sqlite。只需嘗試 – Kalpesh

回答

1

檢查你的代碼來獲得dirPath,你正在正確的道路或沒有,我用我的代碼如下方式和它的工作對我來說:

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
// dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask,YES); 
    fileDir = dirPaths[0]; 

// Build the database path 
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sqlite"]]; 
1

這就是我如何管理它。

DataBaseAccess.m

static sqlite3 *database=nil; 

-(id)init 
{ 
if(self=[super init]) 
{ 
    [email protected]"user_data.db"; 
} 
return self; 
} 


-(void)createUserDataDatabase 
{ 
BOOL success; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:user_data]; 
success = [fileManager fileExistsAtPath:writableDBPath]; 
if (success) return; 

// construct database from external ud.sql 

NSString *filePath=[[NSBundle mainBundle]pathForResource:@"ud" ofType:@"sql"]; 
NSString *sqlStatement=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; 
if(sqlite3_open([writableDBPath UTF8String], &database)==SQLITE_OK) 
{ 
    sqlite3_exec(database, [sqlStatement UTF8String], NULL, NULL, NULL); 
    sqlite3_close(database); 
} 
} 

你的外部SQL文件中必須包含SQL查詢:

CREATE TABLE quantityInSubCountries ( 
refID INT, 
quantity INT 
); 

CREATE TABLE quantityInSubRegions ( 
refID INT, 
quantity INT 
); .... 

希望這將有助於。

0

這是用於數據庫

-(void)updateTable:(NSString *)tableName setname:(NSString *)Name setImagePath:(NSString *)imagePath whereID:(NSInteger)rid{ 

     NSString *sqlString=[NSString stringWithFormat:@"update %@ set name='%@' where id=%ld",tableName,Name,rid]; 

     char *error; 
     if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) { 
      [self closeDatabase]; 
      NSLog(@"Faield to update"); 
     } 
     else{ 

      NSLog(@"update successfully"); 
     } 
    } 

    -(void)deleteFrom:(NSString *)tablename whereName:(NSInteger)rid { 
     NSString *sqlString=[NSString stringWithFormat:@"delete from %@ where id=%ld",tablename,(long)rid]; 

     char *error; 
     if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) { 
      [self closeDatabase]; 
      NSLog(@"faield to Delete"); 
     } 
     else{ 

      NSLog(@"Deleted successfully"); 
     } 
    } 

    -(void)insertInTable:(NSString *)tableName withName:(NSString *)name withImagePath:(NSString *)imagePath 
    { 


     NSString *sqlString=[NSString stringWithFormat:@"insert into %@(name,path)values('%@','%@')",tableName,name,imagePath]; 
     char *error; 
     if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) { 
      [self closeDatabase]; 
      NSLog(@"Failed to insert"); 

     } 
     else{ 
      NSLog(@"Inserted succesfully"); 

     } 

    } 

    -(NSString *)path 
    { 
     NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentDir=[paths objectAtIndex:0]; 
     return [documentDir stringByAppendingPathComponent:@"Storage.db"]; 

    } 
    -(void)open{ 
     if(sqlite3_open([[self path] UTF8String], &db)!=SQLITE_OK) 
     { 
      sqlite3_close(db); 
      NSLog(@"your database table has been crash"); 
     } 
     else{ 
      NSLog(@"Database open successfully"); 
     } 

    } 
    -(void)closeDatabase 
    { 
     sqlite3_close(db); 
     NSLog(@"Database closed"); 
    } 

    -(void)copyFileToDocumentPath:(NSString *)fileName withExtension:(NSString *)ext{ 
     NSString *filePath=[self path]; 
     NSFileManager *fileManager=[NSFileManager defaultManager]; 
     if (![fileManager fileExistsAtPath:filePath]) { 
      NSString *pathToFileInBundle=[[NSBundle mainBundle] pathForResource:fileName ofType:ext]; 
      NSError *err=nil; 
      BOOL suc=[fileManager copyItemAtPath:pathToFileInBundle toPath:filePath error:&err]; 
      if (suc) { 
       NSLog(@"file copied successfully"); 
      } 
      else 
      { 
       NSLog(@"faield to copied"); 
      } 
     } 
     else 
     { 
      NSLog(@"File allready present"); 
     } 

    } 


    -(NSMutableArray *)AllRowFromTableName:(NSString *)tableName{ 
     NSMutableArray *array=[[NSMutableArray alloc] init]; 
     NSString *sqlString=[NSString stringWithFormat:@"select *from %@",tableName]; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &statement, nil)==SQLITE_OK) { 
      while (sqlite3_step(statement)==SQLITE_ROW) { 
       Database *tempDatabase=[[Database alloc] init]; 
       tempDatabase.Hid=sqlite3_column_int(statement, 0); 
       tempDatabase.Hname =[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 
       tempDatabase.Hpath=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 2)]; 
       [array addObject:tempDatabase]; 
      } 
     } 
     return array; 
    } 

-(void)test 
{ 

//Pet photos 
    NSString *sqlString=[NSString stringWithFormat:@"create table if not exists StorageTable(id integer primary key autoincrement,name text,path text)"]; 

    char *error; 
    if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) { 
     [self closeDatabase]; 
     NSLog(@"Faield to blanck 1 %s",error); 
    } 
    else{ 
     NSLog(@"Test On StorageTable Database successfully"); 
    } 
}