Ios 使用sqlite在iPhone的xcode中创建表失败
我使用以下代码在Xcode中创建数据库。它平稳地运行到Ios 使用sqlite在iPhone的xcode中创建表失败,ios,ios4,sqlite,Ios,Ios4,Sqlite,我使用以下代码在Xcode中创建数据库。它平稳地运行到NSFilemanager代码,但之后它将终止到else代码,显示状态。text=@“打开/创建数据库失败”因此无法创建表。 我导入了sqlite3.h并创建了sqlDatabase引用变量sqlite3,但它仍然不起作用 -(void)databaseCreate { NSString *docsDir; NSString *dbPath; NSArray *dirPath; dirPath=NSSearc
NSFilemanager
代码,但之后它将终止到else
代码,显示状态。text=@“打开/创建数据库失败”代码>因此无法创建表。
我导入了sqlite3.h
并创建了sqlDatabase
引用变量sqlite3
,但它仍然不起作用
-(void)databaseCreate
{
NSString *docsDir;
NSString *dbPath;
NSArray *dirPath;
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSLog(@"dirpath::%@",dirPath);
docsDir=[dirPath objectAtIndex:0];
NSLog(@"document directory::%@",docsDir);
dbPath=[[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent:@"timerpro1.db"]];
NSLog(@"database path::%@",dbPath);
NSFileManager *fileManager=[NSFileManager defaultManager];
if([fileManager fileExistsAtPath: dbPath] == NO)
{
const char *databsPath=[dbPath UTF8String];
NSLog(@"treat filemanager");
if(sqlite3_open(databsPath,&sqlDatabase) == SQLITE_OK)
{
char *err;
NSLog(@"create inside");
const char *sql_stmt="CREATE TABLE IF NOT EXISTS PRJDATA(ID INTEGER PRIMERY KEY AUTOINCREMENT,PRJ_NAME TEXT,PRJ_DATE TEXT,TIME_POINT1 TEXT,TIME_POINT2 TEXT,TIME_POINT3 TEXT,POINT2_DIFF_MIN TEXT,POINT2_DIFF_SEC TEXT,POINT3_DIFF_MIN TEXT,POINT3_DIFF_SEC TEXT)";
if (sqlite3_exec(sqlDatabase, sql_stmt, NULL, NULL, &err)!=SQLITE_OK)
{
status.text=@"failed to create table";
}
sqlite3_close(sqlDatabase);
}
else
{
status.text=@"failed to open/create database";
}
}
[fileManager release];
}
眼前的问题是,您必须将对NSDocumentationDirectory
的引用替换为NSDocumentDirectory
两个旁白:
当您遇到故障时,应该检查sqlite3\u errmsg()
,因为您经常会遇到描述性错误。例如,您的sqlite3\u exec()
语句将失败,即使您修复了NSDocumentDirectory
错误
如果查看sqlite3\u errmsg()
错误消息,它将告诉您在AUTOINCREMENT
子句附近有一个错误。如果仔细查看SQL,您会注意到您拼错了主键
。如果没有sqlite3\u errmsg()
,这将更难找到,因为它让我们注意到SQL的特定部分
您可以简化dbPath
声明:
当我使用sqlite3_errmsg()时;在上面提到的代码中,它将生成类似于日志的库例程,按顺序调用,在创建表时不会出现任何其他错误。@hirangsheth这就是文档要说的。简而言之,这意味着调用sqlite3
函数的顺序是错误的。您上面问题的代码(上面有我的两个修复程序)对我来说很好,所以我猜您对代码做了一些更改?也许在关闭数据库后尝试另一个sqlite3
函数?也许你可以在一个新的问题中发布该代码,如果解决方案不是突如其来的话。
dbPath=[docsDir stringByAppendingPathComponent:@"timerpro1.db"];`