2011-11-16 13 views
0

ビジネスロジックなどからSQLiteメソッドを抽象化するクラスを作成しようとしています。しかし、私のデータベースにアクセスすることはできません。作成した。以下のコードをご覧ください。私は指定されたパスでデータベースを開きます。その後、私は後でそれを閉じます。終了後、私は端末を使ってアプリケーション内のDocumentsディレクトリを調べます。この時点で、指定したファイルはありません。データベースにデータを挿入するときにのみファイルを作成しますか?または、データベースを正しく作成していないのですか?私のios sqlite3データベースが作成されていません

#import "SQLController.h" 

@implementation SQLController 
@synthesize database; 

-(id)initWithDefaultDB {  
    return [self initWithDBPath:[self dbFilePath]]; 
} 

-(id)initWithDBPath:(NSString *)dbPath { 
    self = [super init]; 
    if(self) { 
     sqlite3 *db;  
     const char *dbPathCString = [dbPath UTF8String]; 
     int result = sqlite3_open(dbPath, &db); 
     if (result != SQLITE_OK) { 
      NSString *errorTag = @"Failed to open database at "; 
      NSString *errorMessage = [errorTag stringByAppendingString:dbPath]; 
      NSLog(errorMessage); 
      sqlite3_close(db); 
     } else { 
      const char *createQuery = "CREATE TABLE IF NOT EXISTS items (title TEXT, details TEXT, category TEXT);"; 
      self.database = db; 
      char *error; 
      if (sqlite3_exec(self.database, createQuery, NULL, NULL, &error) != SQLITE_OK) { 
       sqlite3_close(self.database); 
       NSLog(@"Failed to create table"); 
       NSAssert(0,@"Error creating table: %s", error); 
      } 
     } 
    } 
    return self; 
} 

-(NSString *)dbFilePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:@"testdb.sqlite"]; 
} 


@end 
+0

sqlite3_open(DBPATH、&db); - コンパイラはあなたがC文字列の代わりにNSStringの合格することについては何も言わなかった –

答えて

1

DBを閉じる前にDBに書き込んでいますか? Sqliteは怠惰です - 最初の書き込みまでDBを作成しません。

もう1つのことは、Cの文字列(dbPathCString)を作成することですが、dbPathを渡しています。

-(id)initWithDBPath:(NSString *)dbPath { 
self = [super init]; 
if(self) { 
    sqlite3 *db;  
    const char *dbPathCString = [dbPath UTF8String]; 
    int result = sqlite3_open(dbPath, &db); 
+0

これが問題だったコンパイラが私に与えました?。。 – justspamjustin

+1

コンパイラの警告を常にエラーとして扱い、直ちに修正するか、問題が発生したときに直面することになります。 – sosborn

1

よりもむしろ車輪の再発明(つまり、多くの楽しみのように、私が知っている、私を信じて!)あなたはFMBDを使用することに興味があるかもしれません。 SQLiteアクセス用のObjective-cラッパーです。

+0

また、これは私の問題を解決しているだろう – justspamjustin