2011-11-16 49 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); - 。和编译器没有告诉你,你通过的NSString而不是C字符串任何 –

回答

1

你有没有在关闭它之前写入数据库? Sqlite懒惰 - 它不会创建数据库,直到第一次写入。

另一件需要注意的事情是创建C字符串(dbPathCString),但不要将它传递给open(您传递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