Iphone 如何解决sqlite_准备错误
我知道当我使用'sqlite3_open'时,将打开一个新的数据库而不是我的sqlite文件。 因此,我使用“sqlite3\u open\u v2”修复了它。 但是现在,我仍然无法从我的文件中获取数据。有人能告诉我怎么做吗? 非常感谢 这是我的密码: - -Iphone 如何解决sqlite_准备错误,iphone,database,xcode,sqlite,Iphone,Database,Xcode,Sqlite,我知道当我使用'sqlite3_open'时,将打开一个新的数据库而不是我的sqlite文件。 因此,我使用“sqlite3\u open\u v2”修复了它。 但是现在,我仍然无法从我的文件中获取数据。有人能告诉我怎么做吗? 非常感谢 这是我的密码: - - 应用程序内的checkAndCreateDatabase函数调用didFinishLaunchingWithOptions方法 之后 -(void) checkAndCreateDatabase { BOOL success;
应用程序内的checkAndCreateDatabase函数调用didFinishLaunchingWithOptions方法 之后
-(void) checkAndCreateDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
if(success) return;
else
printf("NO File found");
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
//[fileManager release];
}
-(void)readDataFromDatabase
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"freeway.sqlite"];
sqlite3_stmt *compiledStatement;
sqlite3 *database;
if(sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
const char *sqlStatement;
sqlStatement = "SELECT * FROM fee";
sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
printf("\nError===%s",sqlite3_errmsg(database));
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
while(sqlite3_step(compiledStatement) == SQLITE_ROW )
{
NSString *str_field1=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
NSString *str_field2=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
NSString *str_field3=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
NSString *str_field4=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
// add str_field into array
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}
使用此NSLog(@“error=%d”,sqlite3_errcode(数据库));获取错误代码我猜它无法捕获文件路径。但我不知道如何让它获取路径。没有错误消息吗?没有调试?没有迹象表明它出了什么问题?错误消息是“没有这样的表:费”“我认为它无法获得路径,而只能创建一个新路径。因此,在新文件中不能有表“费”。这只是我的猜测。我是初学者,不知道如何修复它。NSLog(@“%@”,databasePath);结果:/Users/ai_erh/Library/Application Support/iPhone Simulator/5.1/Applications/1ACA32E4-D668-4A7A-9F42-84ED69999BD/Documents/freeway.sqlitehi,我尝试过你的教学,但仍然打印“失败”和“错误===没有这样的表格:费用“我确信我已将数据库文件复制到项目文档中。看起来它无法获取文件路径。我如何解决它?谢谢。我在上面添加了CheckandCreateDatabase代码。使用该函数而不是checkandcreatedatabase函数。仍然无法获取数据,输出为“错误===没有这样的表:费用”这样做/Users/Library/Application Support/iPhone Simulator/5.1/Applications在该用户项目文档中是否存在.sqlite文件,并检查您的表名该项目文档中是否存在区分大小写的.my freway.sqlite文件。sqlStatement可以在SQLite-Manager中成功。表名是正确的。我在这一点上困惑了3天。我快疯了。
(void)checkAndCreateDatabase
{
BOOL success;
NSFileManager *fileManager=[NSFileManager defaultManager];
success=[fileManager fileExistsAtPath:databasePath];
if (success)
{ NSLog(@"success");
return;
}
else {
NSLog(@"fail");
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}
}
(void)readDataFromDatabase
sqlite3 *database;
fee = [[NSMutableArray alloc]init];
//if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
sqlite3_stmt *stmt;
char *sql = "SELECT * FROM fee";
if (sqlite3_prepare_v2(database,sql,-1,&stmt,NULL) == SQLITE_OK){
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSInteger pID = sqlite3_column_int(stmt, 0);
NSString *pName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
NSString *pName2 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];
Fee_Station *temp = [[Fee_Station alloc] initwithFCID:pID F_Name:pName Fmaileage:pName2];
[fee addObject:temp];
}
}
else {
NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));
}
sqlite3_finalize(stmt);
}
sqlite3_close(database);
}
-(void) checkAndCreateDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
if(success) return;
else
printf("NO File found");
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
//[fileManager release];
}
-(void)readDataFromDatabase
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"freeway.sqlite"];
sqlite3_stmt *compiledStatement;
sqlite3 *database;
if(sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
const char *sqlStatement;
sqlStatement = "SELECT * FROM fee";
sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
printf("\nError===%s",sqlite3_errmsg(database));
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
while(sqlite3_step(compiledStatement) == SQLITE_ROW )
{
NSString *str_field1=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
NSString *str_field2=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
NSString *str_field3=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
NSString *str_field4=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
// add str_field into array
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}