Моя функция не может получить доступ к свойству self, так как код централизован

Я довольно новичок в использовании xCode, поэтому извините, если этот вопрос кажется странным.

В моем приложении я хотел бы, чтобы все представления и представления таблиц направляли свой доступ к БД (sqlite3) через один объект. Я уже запустил функцию openDatabase, но, похоже, есть проблема с функцией, которая создает новую, когда ни одна не доступна.

Все раньше работало, когда код находился в самом представлении, но его централизация делала его намного сложнее, чем я ожидал:(.

ниже моего кода для.h и.m:

beDbAccess.h

//
//  beDbAccess.h
//  myDiveApp
//
//  Created by Jurgen on 07/09/13.
//  Copyright (c) 2013 Dictus. All rights reserved.
//

#import "beObject.h"
#import "sqlite3.h"

@interface beDbAccess : NSObject
{
    NSArray *path;
    NSString *docPath;
    NSString *dbPathString;
    NSFileManager *fileManager;
}

@property (nonatomic, retain) NSArray *path;
@property (nonatomic) NSString *docPath;
@property (nonatomic) NSString *dbPathString;
@property (nonatomic) NSFileManager *fileManager;

#pragma functions callable from the outside
NSString *openDatabase();

#pragma functions
-(void)createNewDatabase;

@end

=================

beDbAccess.m

//
//  beDbAccess.m
//  myDiveApp
//
//  Created by Lion on 07/09/13.
//  Copyright (c) 2013 Dictus. All rights reserved.
//
//  LET EROP DAT JE NOOIT '' gebruikt rond de veldnamen in de WHERE CLAUSE !!!

#import "beDbAccess.h"

@implementation beDbAccess
@synthesize path, dbPathString, docPath, fileManager;

NSMutableArray *arrayOfButtons;

sqlite3 *myDb;
NSArray *path;
NSFileManager *fileManager;
NSString *docPath, *dbPathString;
UIRefreshControl *refreshControl;

NSString *openDatabase()
{
    sqlite3 *myDb;
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [path objectAtIndex:0];
    NSString *dbPathString = [docPath stringByAppendingPathComponent:@"myDb.db"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:dbPathString])
    {
        const char *dbPath = [dbPathString UTF8String];
        if (sqlite3_open(dbPath, &myDb)==SQLITE_OK)
        {
            NSLog(@"   Create Database: EMPTY ...");
 /*!*/      [self createNewDatabase]; // This is where the problem lies... Use of undeclared identifier 'self' :(
        } else NSLog(@"#Local: db open...");
    }
    return dbPathString;
}

1 ответ

Решение

Функции не являются методами концептуально

Функции не знают о собственном указателе, потому что они обычно не принадлежат классу


В вашем случае вы должны сделать функцию частью класса ИЛИ дать ей доступ к классу каким-либо другим способом (который не будет в стиле ОО)

например

@interface beDbAccess : NSObject
{
    NSArray *path;
    NSString *docPath;
    NSString *dbPathString;
    NSFileManager *fileManager;
}

@property (nonatomic, retain) NSArray *path;
@property (nonatomic) NSString *docPath;
@property (nonatomic) NSString *dbPathString;
@property (nonatomic) NSFileManager *fileManager;

#pragma functions callable from the outside
+ (id)sharedInstance;
-(NSString*)openDatabase;

#pragma functions
-(void)createNewDatabase;

@end

Затем использовать его снаружи, как:

[[beDbAccess sharedInstance] openDatabase];
Другие вопросы по тегам