ошибка при попытке извлечь и вставить данные в базу данных sqlite - PullRequest
0 голосов
/ 14 апреля 2011

Я создаю приложение, в котором я использую базу данных sqlite для сохранения данных. Но когда я запускаю свое приложение, я получаю следующие ошибки:

@interface TDatabase : NSObject {
    sqlite3 *database;
}

+(TDatabase *) shareDataBase;

-(BOOL) createDataBase:(NSString *)DataBaseName;

-(NSString*) GetDatabasePath:(NSString *)database;

-(NSMutableArray *) getAllDataForQuery:(NSString *)sql forDatabase:(NSString *)database;
-(void*) inseryQuery:(NSString *) insertSql forDatabase:(NSString *)database1; 

@end

#import "TDatabase.h"
#import <sqlite3.h>

@implementation TDatabase

static TDatabase *SampleDataBase =nil;

+(TDatabase*) shareDataBase{

    if(!SampleDataBase){
        SampleDataBase = [[TDatabase alloc] init];
    }

    return SampleDataBase;
}

-(NSString *)GetDatabasePath:(NSString *)database1{

    [self createDataBase:database1];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:database1];

}

-(BOOL) createDataBase:(NSString *)DataBaseName{ 

    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DataBaseName];

    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) return success;
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DataBaseName];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];

    if (!success) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!!!" message:@"Failed to create writable database" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        [alert show];
        [alert release];

    }
    return success;
}


-(NSMutableArray *) getAllDataForQuery:(NSString *)sql forDatabase:(NSString *)database1{

    sqlite3_stmt *statement = nil ;

    NSString *path = [self GetDatabasePath:database1];

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

    if(sqlite3_open([path UTF8String],&database) == SQLITE_OK )
    {
        NSString *query = sql;

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

                NSMutableDictionary *currentRow = [[NSMutableDictionary alloc] init];

                int count = sqlite3_column_count(statement);

                for (int i=0; i < count; i++) {

                    char *name = (char*) sqlite3_column_name(statement, i);
                    char *data = (char*) sqlite3_column_text(statement, i);

                    NSString *columnData;
                    NSString *columnName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];


                    if(data != nil)
                        columnData = [NSString stringWithCString:data encoding:NSUTF8StringEncoding];
                    else {
                        columnData = @"";
                    }

                    [currentRow setObject:columnData forKey:columnName];
                }

                [alldata addObject:currentRow];
            }
        }
        sqlite3_finalize(statement); 
    }
    sqlite3_close(database);

    return alldata;

}


-(void*) inseryQuery:(NSString *) insertSql forDatabase:(NSString *)database1{

    sqlite3_stmt *statement = nil ;

    NSString *path = [self GetDatabasePath:database1];

    if(sqlite3_open([path UTF8String],&database) == SQLITE_OK )
    {
        if((sqlite3_prepare_v2(database,[insertSql UTF8String],-1, &statement, NULL)) == SQLITE_OK)
        {
            if(sqlite3_step(statement) == SQLITE_OK){
            }
        }
        sqlite3_finalize(statement); 
    }
    sqlite3_close(database);

    return insertSql;
}



NSString *sql = @"select * from Location"; 
const location = [[TDatabase shareDataBase] getAllDataForQuery:sql forDatabase:@"journeydatabase.sqlite"];//1

NSString* insertSql = [NSString stringWithFormat:@"insert into Location values ('city','name','phone')"];//2
const insert =[[TDatabase shareDataBase] inseryQuery:insertSql forDatabase:@"journeydatabase.sqlite"];//3

в строке № 1,2,3 я получаю ту же ошибку: «элемент инициализатора не является константой»

в чем может быть проблема. Пожалуйста, кто-нибудь поможет мне в решении этой проблемы. Спасибо

1 Ответ

0 голосов
/ 17 апреля 2011

@ rani Написание собственных методов для работы с базой данных sqlite очень трудоемко. Вы должны использовать класс-оболочку fmdb или использовать данные ядра. Я лично предпочитаю fmdb. Первоначально я делал то же самое, что и вы. Я нашел про fmdb здесь. После его использования мне приходилось писать очень мало кода всякий раз, когда мне приходилось иметь дело с sqlite db.

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