iPhone SDK: ошибка SQLite: такой таблицы нет: даже если терминальный запрос вернется успешно - PullRequest
0 голосов
/ 02 июня 2011

У меня проблема с интеграцией базы данных 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 голосов
/ 28 апреля 2012

Основные проблемы с моей точки зрения. Я зашел так далеко, что удалил все возможности базы данных, а затем запустил приложение, и оно все равно открыло базу данных.

У меня есть этот код в applicationDidFinishLaunchingWithOption в appDelegate. Он предназначен для запуска проверки правильности доступной базы данных, поэтому в основном она никогда не выполняется. Я удалил условный оператор вокруг копии и вставил оператор 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);
}
0 голосов
/ 30 октября 2012

Если вы добавляете таблицу в существующую базу данных, а затем пытаетесь повторно добавить ее в свой проект, вы можете захотеть убедиться в том, что вы удалили копию базы данных в том месте, где копирует Xcodeэто до загрузки вашего приложения в симуляторе.Например, когда у меня возникла эта проблема, мне пришлось пойти в /Users/<user>/Library/Application Support/iPhone Simulator/6.0/Applications/1234DFE1-5AA9-4CFF-0235-3D98961E9281/Documents/, чтобы удалить базу данных там.Когда я очистил и снова запустил симулятор, он нашел мой новый стол очень хорошо.

0 голосов
/ 02 июня 2011

Судя по отсутствующей таблице, создается впечатление, что она создает новую базу данных на path.Таким образом, либо неверный путь, либо возможно, что вы не скопировали базу данных master в это место.Файл SQLite обычно находится в комплекте и должен быть скопирован первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...