iPhone SDK:SQLite错误:没有这样的表:,即使终端查询返回成功

时间:2011-06-01 22:48:46

标签: iphone sqlite

我的应用程序中存在sqlite数据库集成的问题。 我的应用程序使用翻译器样式功能,用户文本条目转换为另一种措辞相同的单词,单词替代词列在SQLite数据库中。

基本上,代码用于获取文本,将其拆分为单个单词,并在数据库中搜索它们,并返回每个单词的结果,但是,应用程序最终没有返回结果,我收到错误“错误:没有这样的表:字典“即使终端上的查询成功返回结果。

任何人都可以帮我确定做错了什么吗?感谢

这是我使用的代码:

-(void)translate{
//take input and break into an array
NSString *clearText = [[NSString alloc] init];
clearText=inputBox.text;
NSArray *words = [[NSArray alloc] init];
words= [clearText componentsSeparatedByString:@" "];
numOfWords=words.count;
NSString *newText=@"";
//open database
sqlite3 *db = [self getNewDBConnection];
//loop through array
for(i=0;i<numOfWords;i++){
    sqlite3_stmt *resultStatement= nil;
    NSString *res = [NSString stringWithFormat:@"select * from dictionary where plain='%@'",[words objectAtIndex:i]];
    if((sqlite3_prepare_v2(db, [res UTF8String], -1, &resultStatement, nil))!=SQLITE_OK){
        NSLog(@"Error getting result, maybe word not found\n"); 
         //NSLog(@"tried query:%@",res);
        NSLog(@"error: %s", sqlite3_errmsg(db));
    }
    else{
        if(sqlite3_step(resultStatement)==SQLITE_ROW){
            //in the line below, 1 is the column number of the replacement word
            NSString *add = [[NSString alloc] initWithUTF8String: (char*)sqlite3_column_text(resultStatement,1)];
            newText=[newText stringByAppendingString:add];
            [add release];
        }
    }
    sqlite3_finalize(resultStatement);
}
//output result
outputBox.text=newText;
sqlite3_close(db);
}
-(sqlite3 *) getNewDBConnection{
sqlite3 *newDBconnection;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data9.sqlite"];


if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) {

    NSLog(@"Database Successfully Opened");

} else {
    NSLog(@"Error in opening database");
}

return newDBconnection; 
}

这是用于复制数据库的代码:

- (void)createEditableCopyOfDatabaseIfNeeded {
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"data9.sqlite"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success)  return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data9.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
    NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
   }
}

3 个答案:

答案 0 :(得分:0)

基于缺失的表,看起来它正在path创建一个新数据库。因此,路径错误,或者您可能没有将master数据库复制到该位置。 SQLite文件通常在bundle中,需要先复制。

答案 1 :(得分:0)

从我的角度来看主要问题。 我甚至删除了整个数据库功能,然后运行了应用程序,它仍然打开了数据库。

我在appDelegate中的applicationDidFinishLaunchingWithOption中有这段代码。它设计用于启动以检查有效的数据库是否可用,因此大多数情况下它永远不会被执行。我删除了副本周围的条件语句,并插入了removeItemAtPath语句来删除该文件。跑了一次,我的问题全部消失了(至少那些与数据库,最大的问题仍然是用户错误: - )

NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"languageDB.sqlite"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

NSError *error;
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"language.sqlite"];
NSString *writableDBPath = [docsDir stringByAppendingPathComponent:@"languageDB.sqlite"];

if ([filemgr fileExistsAtPath: databasePath ] == NO){

[filemgr copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
NSLog(@"copy error %@",error);
}

答案 2 :(得分:0)

您可能想要确定的是,如果您要将表添加到现有数据库,然后尝试将其重新添加到项目,则可以删除Xcode正在复制的位置中的数据库副本它在您的应用程序在模拟器中加载之前。例如,当我遇到这个问题时,我不得不进入/Users/<user>/Library/Application Support/iPhone Simulator/6.0/Applications/1234DFE1-5AA9-4CFF-0235-3D98961E9281/Documents/删除那里的数据库。当我清理并重新运行模拟器时,它发现我的新表很好。