尝试创建sqlite数据库时遇到错误'无法创建表'IOS7

时间:2014-06-19 09:21:55

标签: ios sqlite insert

嗨,在我的应用程序中我正在尝试创建一个本地数据库来存储具有主键自动增量值的值,但它给出的错误就像。

2014-06-19 14:34:28.499 brt[2363:80b] *** Assertion failure in -[listviewpoliticalViewController createTable:withField1:withField2:withField3:withField4:], /Users/madhavadudipalli/Desktop/ ios projects/brt/brt/listviewpoliticalViewController.m:37

2014-06-19 14:34:28.501 brt[2363:80b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not create table'

我收到上述错误,请告诉我如何解决此问题。

我的数据库在.h文件中创建代码。

    -(NSString *) filePath;
    -(void)openDB;

    -(void) createTable: (NSString *) tableName
        withField1:(NSString *) field1
        withField2:(NSString *) field2
        withField3:(NSString *) field3
        withField4:(NSString *) field4;

.m文件中的数据库代码。

     -(void) createTable: (NSString *) tableName
         withField1:(NSString *) field1
         withField2:(NSString *) field2
         withField3:(NSString *) field3
        withField4:(NSString *) field4;
   {
     char *err;
     NSString *sql =[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ( Id integer PRIMARY KEY,'%@' TEXT, '%@' TEXT, '%@' TEXT);",tableName,field1,field2,field3];
   if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
       sqlite3_close(db);
       NSAssert(0, @"Could not create table");
      }else{
       NSLog(@"Table Created");
      }

    }
    -(NSString *) filePath{
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"bp.sqlite"];
   }
   -(void)openDB{
    if (sqlite3_open([[self filePath] UTF8String], &db)!=SQLITE_OK) {
       sqlite3_close(db);
       NSAssert(0, @"Database failed to open");

    }else{
      NSLog(@"database opened");
    }
  }

我已使用上面的代码在sqlite中创建数据库请告诉我在上面的代码中我做错了如何解决这个问题我已经在这里打了很长时间请帮助我。

感谢。

1 个答案:

答案 0 :(得分:5)

格式化SQL语句时遇到一些错误。您不应使用'%@ '。只需使用%@

这是一个工作示例:

@interface SQLiteManager ()

@property (strong, nonatomic) NSString *databasePath;
@property (nonatomic) sqlite3 *myDataBase;

@end

@implementation SQLiteManager

- (void)createDatabase
{
    // get the path to our data base
    NSArray *directories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *doctumentsDirectory = [directories lastObject];
    self.databasePath = [[NSString alloc] initWithString:[doctumentsDirectory stringByAppendingPathComponent:@"/yourDataBaseName.db"]];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    // create DB if it does not already exists
    if (![fileManager fileExistsAtPath:self.databasePath]) {

        const char *dbPath = [self.databasePath UTF8String];

        if (sqlite3_open(dbPath, &_myDataBase) == SQLITE_OK) {

            char *errorMsg;
            const char *sql_statement = "CREATE TABLE IF NOT EXISTS SOME_TABLE_NAME (ID INTEGER PRIMARY KEY AUTOINCREMENT, FIRST_NAME TEXT, LAST_NAME TEXT)";

            if (sqlite3_exec(_myDataBase, sql_statement, NULL, NULL, &errorMsg) != SQLITE_OK) {

                [self errorCreatingTable:[NSString stringWithFormat:@"failed creating table. ERROR:%s", errorMsg]];
            }

            sqlite3_close(_myDataBase);

        } else {

            [self errorCreatingTable:@"failed openning / creating table"];
        }
    }
}

- (void)errorCreatingTable:(NSString *)errorMsg
{
    NSLog(@"%@", errorMsg);
}