-1

iOS 7でsqliteを使用するには? コード iOS 6 を使用しようとしていますが、iOS 7 では機能しません

アップデート!

データベースをデスクトップにエクスポートし、名前を変更して xcode にドラッグ アンド ドロップし ここに画像の説明を入力 ます。コードを追加します。

// SQLite
// Conexion DB
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];

_databasePath = [documentDirectory stringByAppendingPathComponent:@"ambisi_test.sqlite"];
[self loadDB];
// --> End SQLite



-(void)loadDB{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];

NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"ambisi_test.sqlite"];

BOOL exito = [fileManager fileExistsAtPath:writableDBPath];
if(exito) return;

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"ambisi_test.sqlite"];

BOOL exit = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];

if(!exit) NSLog(@"%@",[error localizedDescription]);

}

- (void) clickFavorites{

sqlite3 *database = NULL;
sqlite3_stmt *sentencia = NULL;

// Si la BD se ha abierto bien
if(sqlite3_open([appDelegate.databasePath UTF8String], &database) == SQLITE_OK){
    // Genero la query
    NSString *sql = [NSString stringWithFormat:@"INSERT INTO estaciones (\"id_number\", \"name\",\"addres\",\"latitude\",\"longitude\") VALUES (\"%i\",\"%@\",\"%@\",\"%f\",\"%f\")", self.modelAnnotation.number, self.modelAnnotation.name,self.modelAnnotation.address, self.modelAnnotation.lat,self.modelAnnotation.lng];
    NSLog(@"%@",sql);
    // Si esta no contien errores
    if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &sentencia, NULL)==SQLITE_OK){

        // Si la estación no existe ya como favorita, la almacenaré, o en el caso contrario la elimnaré
        if(![self isFavoriteWithIdStation:self.modelAnnotation.number database:database]){
            // Insisto hasta que se inserte
            if (sqlite3_step(sentencia) != SQLITE_DONE){
                 NSLog(@"Error in INSERT step: %s", sqlite3_errmsg(database));
            }else{
                // Ademas de cambiarle la imagen
                UIImage *image = [UIImage imageNamed:@"quitar-favorito"];
                [_button setBackgroundImage:image forState:UIControlStateNormal];
            }

        }else{ // La elimino de favoritas
            // Genero la query
            NSString *sql = [NSString stringWithFormat:@"DELETE FROM estaciones WHERE id_number = \"%i\"",self.modelAnnotation.number];
            // Si esta no contien errores
            if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &sentencia, NULL)==SQLITE_OK){
                // Insisto hasta que se inserte
                if (sqlite3_step(sentencia) != SQLITE_DONE){
                    NSLog(@"Error in DELETE step: %s", sqlite3_errmsg(database));
                }else{
                    // Ademas de cambiarle la imagen
                    UIImage *image = [UIImage imageNamed:@"addfav"];
                    [_button setBackgroundImage:image forState:UIControlStateNormal];
                }
            }
        }
    }else{
        NSLog(@"Error making INSERT: %s",sqlite3_errmsg(database));
    }
    sqlite3_finalize(sentencia);
}else{
    NSLog(@"Doesn't open Database: %s",sqlite3_errmsg(database));
}
sqlite3_close(database);

}

- (BOOL) isFavoriteWithIdStation:(int) idStation database:(sqlite3 *)db{

sqlite3_stmt *sentencia = NULL;
NSString *sql = [NSString stringWithFormat:@"SELECT id_number FROM estaciones"];
NSLog(@"%i",idStation);
NSString * ide = [NSString stringWithFormat:@"%i",idStation];
if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &sentencia, NULL)==SQLITE_OK){
    while(sqlite3_step(sentencia) == SQLITE_ROW){
        NSLog(@"%i",idStation);
        NSString *number = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sentencia, 0)];
        //NSString *id_tutorialString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
        if([number isEqualToString:ide]){
            NSLog(@"NUMBER:%@",number);
            NSLog(@"NUMBER:%i",idStation);
            sqlite3_finalize(sentencia);
            return YES;
        }else{
            NSLog(@"Error en el condicional");
        }

    }
}else{
    NSLog(@"Error making SELCET: %s",sqlite3_errmsg(db));
}
sqlite3_finalize(sentencia);

return NO;

}

エラーは NSLog でトリガーされます (@ "Error Making INSERT:% s", sqlite3_errmsg (データベース)); 応答はINSERTエラーを作成しています:ファイルは暗号化されているか、データベースではありません

また、DBを再作成して数回インポートしようとしましたが、それでも同じエラーが発生します..

iOS シミュレーター iOS 6 では動作するが iOS7 では動作しない場合... はまれですが、iOS7 で SQLite を使用しようとした人はいますか? ..

あなたが私を助けてくれることを願っています、ありがとう!

4

2 に答える 2

2

エラーコードを確認する必要があります。

したがって、次の行は次のようになります。

NSLog(@"Error making INSERT");

言うべきです:

NSLog(@"Error making INSERT: %s", sqlite3_errmsg(database));

同様に、次の行があります。

NSLog(@"Error la SELECT");

言うべきです:

NSLog(@"Error la SELECT: %s", sqlite3_errmsg(database));

これらのエラー メッセージを確認することによってのみ、問題を効果的に診断できます。


「ファイルは暗号化されているか、データベースではありません」と表示されていると報告します

これは、データベースが何らかの形で破損したことを示唆しています (暗号化を使用したことがないと仮定します)。あなたはそれを作り直したいと思うでしょう。


より広範な問題とは関係ありませんが、INSERTステートメントのコードには次の行があります。

// Insisto hasta que se inserte
while(sqlite3_step(sentencia) == SQLITE_OK);

それは次のようになります。

if (sqlite3_step(sentencia) != SQLITE_DONE)
    NSLog(@"Error in INSERT step: %s", sqlite3_errmsg(database));
于 2013-09-24T23:14:20.677 に答える
1

解決しました!

Firefoxプラグインを使用してデータベースをエクスポートする際に私が犯した主な間違い..

解決策は、データベースの作成時に、エクスポートせずに目的の場所を保存することです..

@Rob@Hot Licksに関心をお寄せいただきありがとうございます。

于 2013-09-25T20:26:48.487 に答える