2013-12-19 4 views
1

Я не могу создать базу данных sqlite в каталоге моих документов. Вот код:Создать базу данных Sqlite в iOS

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, &) == SQLITE_OK

Я не знаю, что я делаю неправильно. Любая помощь будет оценена ...

Спасибо,

+0

Uh, какой код возврата * это * sqlite3_open возвращается? И что сообщает sqlite3_errmsg? –

+0

(BTW, предполагая, что вы действительно «отлаживаете», чтобы узнать, где он сбой, компилятор не задействован.) –

+0

Мне кажется, вам нужно изменить расширение файла i.e. 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"); 
    } 
} 
Смежные вопросы