nni*_*lax 2 sqlite iphone objective-c ios
我的sqlite prepare语句有些困难.我得到一个错误,说我的桌子不存在,虽然我已经在多个地方检查了它,它确实存在,所以我很困惑.
数据库存在并运行我的sql语句让我得到我期望的结果.
- (NSMutableArray *) getMyWorkout{
NSMutableArray *workoutArray = [[NSMutableArray alloc] init];
@try {
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"IOSDB.sqlite"];
NSLog(@"Db path is %@",dbPath);
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success) {
NSLog(@"Cannot locate database file '%@'.", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)){
sqlite3_close(db);
NSLog(@"Failed to open database with message '%s'.", sqlite3_errmsg(db));
}
const char *sql = "SELECT Id, type, difficulty, duration, description FROM workoutTbl";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK){
NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(db), sqlite3_errcode(db));
} //...
Run Code Online (Sandbox Code Playgroud)当我运行它时,我得到文件路径和以下错误
2013-02-01 18:07:08.060 TriShake[9251:c07] -[MyWorkoutList getMyWorkout] Prepare failure 'no such table: workoutTbl' (1)
Run Code Online (Sandbox Code Playgroud)
我已经检查了其他这些问题,但一直无法找到解决方案
据我所知,如果数据库路径不存在,sqlite3_open()会为您创建一个空数据库,但我知道它存在,因此会产生挫败感.您可以给我的任何帮助或指导将不胜感激.
就你眼前的问题而言,它会变得简单.
你说你已经"清理并再次构建",但你真的从模拟器中删除了旧的应用程序吗?手动删除应用程序,或者更简单,只需从"iOS模拟器"菜单中选择"重置内容和设置"即可完全重置模拟器.有时Xcode不知道要复制哪些文件(特别是在这种情况下,你在设备上运行它可能会改变模拟器包中文件的时间戳!)
再次运行该应用程序.
如果应用程序无法按预期工作,请从Mac打开模拟器文件夹中的数据库,并检查数据库以确保表格在那里并且正如您预期的那样.因此,导航到应用程序,打开捆绑包(您可能必须选择"显示包内容"选项),确认数据库的存在,但同样重要的是,在您喜欢的Mac sqlite3工具中打开数据库的这个特定副本选择并确认那里有桌子的存在.
让我们知道你发现了什么.同样,它必须是简单的,例如:
也许重建应用程序的过程并非重新安装所有内容; 我偶尔遇到Xcode选择在我的模拟器上安装时不重新复制某些内容的问题;
也许您的项目中的数据库被意外地放在子目录中,更糟糕的是,您可能有两个副本位于不同的目录中;
也许您的Xcode项目中的数据库丢失(或者在表或文件的名称中有拼写错误或(例如,在设备的情况下),文件名大写不正确);
等等.
对于很多这些错误,在完全重置模拟器本身之前,您不会注意到该问题.它可能有一百万件小事,但希望完全重置模拟器并重新开始将帮助您找到问题.它总是简单的东西,当涉及到此类问题.
其他一些小的观察:
您可能不应该从捆绑包中打开数据库.以编程方式将其从捆绑包复制到该Documents文件夹,然后从那里打开数据库.我知道这似乎是不必要的,但这有很多原因很重要(如果db在应用程序运行期间发生变化,如果db意外地在你身上创建,请不要让Xcode对变化的事情感到困惑(即使只是文件时间戳)在Xcode背后改变的捆绑等等)
如果需要数据库,则应sqlite3_open_v2使用SQLITE_OPEN_READWRITE或SQLITE_OPEN_READONLY作为标志(但不包括SQLITE_OPEN_CREATE).它会让sqlite有机会为你创建一个空白数据库,或以其他方式修改它,所以永远不要给它机会.
| 归档时间: |
|
| 查看次数: |
9300 次 |
| 最近记录: |