глобальная переменная iphone - PullRequest
2 голосов
/ 26 апреля 2009

Я хочу открыть свою базу данных SQLite в своем классе appDelegate и ссылаться на эту базу данных во всех других моих классах, которым нужна база данных. Я пытался с помощью: статический sqlite3 * база данных = ноль;

Но когда я пытаюсь сослаться на него в других моих классах с помощью appDelegate.database, я получаю ошибку компиляции «error: запрос члена базы данных в чем-то, что не является структурой или объединением» Как вы относитесь к этим типам свойств?

Ответы [ 3 ]

6 голосов
/ 26 апреля 2009

Вы должны получить доступ к любым переменным, хранящимся в приложении Delegate, по следующей общей формуле:

YourAppDelegateName *delegate = (YourAppDelegateName *)[[UIApplication sharedApplication]delegate];
//access specific variables in delegate as follows:
sqlite3 *temp = delegate.database;
1 голос
/ 26 апреля 2009

Мне нужно было создать свойство экземпляра для базы данных. Мое предположение, что статическое объявление было достаточным, было неверным. Кстати, совет FMDB / ORM отличный. Я большой поклонник ОРМ. Тем не менее, этот проект - мой первый iphone, и это небольшой объем работы с базами данных, и я хочу научиться. Итак, я собираюсь сделать это старой школы. Спасибо за совет.

Вот изменения кода, которые я сделал, чтобы моя глобальная ссылка работала. Надеюсь, это кому-нибудь поможет:

/* myAppDelegate.h file */
#import <sqlite3.h>

@interface myAppDelegate : NSObject <UIApplicationDelegate> {
... // you may have windows etc here
    sqlite3 *database;

}

@property (readwrite) sqlite3 *database;


/* myAppDelegate.m file */
@implementation myAppDelegate
...
@synthesize database;

/* some method in some class that uses the database */
- (void) getSomeData
{
    myAppDelegate *appDelegate = (myAppDelegate *) [[ UIApplication sharedApplication ] delegate ];

    const char *sql = "SELECT * FROM myTable";
        sqlite3_stmt *selectstmt;
        if(sqlite3_prepare_v2(appDelegate.database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
{
// get the data here.
}

}
1 голос
/ 26 апреля 2009

Я предлагаю вам использовать обёртку FMDB Objective C для sqlite. Это действительно упростит доступ к вашей базе данных sqlite. Вы можете скачать его с

http://code.google.com/p/flycode/source/browse/trunk/fmdb#fmdb/src

Тогда

вы можете использовать следующий пример кода и использовать переменную NSString * db_path для доступа к вашей БД из других классов (вы используете делегат приложения для доступа к db_path, затем используйте

FMDatabase *db = [FMDatabase databaseWithPath:db_path];

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

- (NSString *) initialize_db {
    NSString *DATABASE_RESOURCE_NAME = @"yourDbName";
    NSString *DATABASE_RESOURCE_TYPE = @"db";
    NSString *DATABASE_FILE_NAME = @"yourDbName.db";

    // copy the database from the bundle if necessary
    // look to see if DB is in known location (~/Documents/$DATABASE_FILE_NAME)
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentFolderPath = [searchPaths objectAtIndex: 0];
    NSString *dbFilePath = [documentFolderPath stringByAppendingPathComponent: DATABASE_FILE_NAME];
    [dbFilePath retain];

    if (! [[NSFileManager defaultManager] fileExistsAtPath: dbFilePath]) {
        // didn't find db, need to copy
        NSString *backupDbPath = [[NSBundle mainBundle]
                                  pathForResource:DATABASE_RESOURCE_NAME
                                  ofType:DATABASE_RESOURCE_TYPE];
        if (backupDbPath == nil) {
            // couldn't find backup db to copy, bail
            NSLog (@"couldn't init db");
            return NULL;
        } else {
            BOOL copiedBackupDb = [[NSFileManager defaultManager]
                                   copyItemAtPath:backupDbPath
                                   toPath:dbFilePath
                                   error:nil];
            if (! copiedBackupDb) {
                // copying backup db failed, bail
                NSLog (@"couldn't init db");
                return NULL;
            }
        }
    }


    return dbFilePath;

}

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    FMResultSet *item_rs;   


    // copy the database from the bundle if necessary
    db_path = [self initialize_db];
    if (! db_path) {
        // TODO: alert the user!
        NSLog (@"couldn't init db");
        return;
    }


    FMDatabase *db = [FMDatabase databaseWithPath:db_path];
    if (![db open]) {
        NSLog(@"Could not open the db");
    }


    FMResultSet *rs = [db executeQuery:@"select * from yourTable"];
    if ([db hadError]) {
        NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
    }

    while ([rs next]) {
        [yourArray addObject:[rs stringForColumn:@"yourColumnName"]];

    }

    [rs close];  



    [db close];


    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...