1

複数のデータベースを読み取る多言語辞書アプリを作成しましたが、ブックマリングに問題があります... アプリの MainViewController には、ユーザーが辞書を選択するアクション メニューがあります。そのため、これらの辞書がどの辞書が選択されているかを認識するためのキーを作成しました。これが私のコードです:

データベースの読み取り

- (NSString *) getDBPath
{
    NSInteger kValue = [[[NSUserDefaults standardUserDefaults] stringForKey:@"Bv"] intValue];

    NSString *documentsDir = [[NSString alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    documentsDir = [paths objectAtIndex:0];


    switch (kValue) {
        case 1:
             documentsDir = [[NSBundle mainBundle]pathForResource:@"eg-pr" ofType:@"sqlite"];
            break;

            case 2:
             documentsDir = [[NSBundle mainBundle]pathForResource:@"pr-eng" ofType:@"sqlite"];
        default:
            break;
    }

    return documentsDir;
}

問題は、デバイス上の単語をブックマークできないことです!! 何が問題ですか ???

ここに辞書変更機能があります:

- (void)eng_pr
{

    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:1] forKey:@"Bv"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    dbClass.viewController = self;
    self.searchbar.placeholder = @"Search";
    [myTable reloadData];
}

とブックマーク:

-(void) setBookMark:(NSInteger)oid {

    sqlite3_stmt    *statement;

    const char *dbpath = [[self getDBPath] UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *SetFavSQL = [NSString stringWithFormat: @"UPDATE DIC SET bookmark=1 WHERE id=\"%d\"", oid];
        //      NSLog(@"%@",SetFavSQL);
        const char *SetFav_stmt = [SetFavSQL UTF8String];

        sqlite3_prepare_v2(database, SetFav_stmt, -1, &statement, NULL);
        if (sqlite3_step(statement) != SQLITE_DONE)
        {

        }
        sqlite3_finalize(statement);
        sqlite3_close(database);
    }

}

編集済み:

検索機能

- (void)searchWord:(NSString *)txt{

    NSMutableArray *DB_Array = [[NSMutableArray alloc] init];


    NSString *dbPath = [[NSString alloc] initWithString: [self getDBPath]];

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {


        NSString *sql =[NSString stringWithFormat:@"SELECT * FROM DIC Where Name LIKE \'%@%%\' order by NAME LIMIT 30",txt];

        sqlite3_stmt *compiledStatement;

        if(sqlite3_prepare_v2(database, [sql UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK) {
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

                NSInteger oid = sqlite3_column_int(compiledStatement, 0);

                const char* f1 = (const char*)sqlite3_column_text(compiledStatement, 1);
                NSString *oName = f1 == NULL ? nil : [[NSString alloc] initWithUTF8String:f1];

                const char* f2 = (const char*)sqlite3_column_text(compiledStatement, 2);
                NSString *oMean = f2 == NULL ? nil : [[NSString alloc] initWithUTF8String:f2];


                const char* f3 = (const char*)sqlite3_column_text(compiledStatement, 3);
                NSString *oPron = f3 == NULL ? nil : [[NSString alloc] initWithUTF8String:f3];

                NSInteger bm = sqlite3_column_int(compiledStatement, 5);

                readerClass = [[Reader alloc]initWithReadDB:oid Name:oName Mean:oMean Pron:oPron bookMark:bm];

                [DB_Array addObject:readerClass];

            }
        }
        else {
            NSLog(@"Error retrieving data from database.");
        }
        sqlite3_close(database);
    }
    else {

        NSLog(@"Error: Can't open database!");

    }

    AppDelegate *appDelegateClass = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegateClass.wordList removeAllObjects];
    [appDelegateClass.wordList=DB_Array mutableCopy];
}
4

1 に答える 1

3

問題は、データベース (.sqlite) がリソース フォルダーにあり、リソース フォルダー内のすべてのデータ/ファイルを読み取ることはできますが、書き込むことができないことです。また、ブックマーク メソッドを呼び出すと、クエリ (UPDATE ...) が実行されるため、SQLite 内のデータを変更しようとしますが、.sqlite が Resources フォルダーにあるため変更できません。

問題の解決策は、.sqlite ファイルをリソース ディレクトリではなく Document ディレクトリに置くことです;)

編集:私があなたの場合、最初のアプリケーションの起動時に、すべての .sqlite を Resources フォルダーから Document フォルダーにコピーし、Document フォルダーにある .sqlite を操作します。

役立つヒント: Resources フォルダーから Document フォルダーにファイルをコピーする

編集2:

これを行う場合:

switch (kValue) {
    case 1:
         documentsDir = [[NSBundle mainBundle]pathForResource:@"eg-pr" ofType:@"sqlite"];
        break;

        case 2:
         documentsDir = [[NSBundle mainBundle]pathForResource:@"pr-eng" ofType:@"sqlite"];
    default:
        break;
}

Resource フォルダからファイルを読み込んでいます。docuemnt ディレクトリから sqlite を読み込む必要があります。

switch (kValue) {
    case 1:
         documentsDir = [NSString stringWithFormat:@"%@/eg-pr.sqlite", documentsDir];
        break;

        case 2:
         documentsDir = [NSString stringWithFormat:@"%@/pr-eng.sqlite", documentsDir];
    default:
        break;
}

さらに、kValue が 1 または 2 に等しくない場合、documentDir は [paths objectAtIndex:0] に等しくなります。(したがって、ドキュメントディレクトリにあるsqliteファイルではなく、ドキュメントディレクトリ自体を返します)そのようなものにする必要がありますか?:

documentsDir = [NSString stringWithFormat:@"%@/filename.sqlite", documentsDir];
于 2012-10-25T15:01:17.140 に答える