Как выполнить метод в другом файле? - PullRequest
0 голосов
/ 09 марта 2011

Я пытаюсь разделить весь мой код SQLite в отдельном файле .m (называемом SQLiteDB.m вместе с файлом .h). Я вызываю один из методов из другого файла: ReaderAppDelegate.m ". Код:

//  create the d/b if it doesn't exist
[self checkForDatabase];

В ReaderAppDelegate.h у меня есть:

#import <UIKit/UIKit.h>
#import <sqlite3.h>

@class ReaderViewController;

@interface ReaderAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    ReaderViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ReaderViewController *viewController;

- (void)checkForDatabase;
//- (void)SQLiteConnection: (NSString *)defaultDBPath;
@end

Очевидно, он не может его найти, потому что он находится в SQLiteDB.m.

#import "SQLiteDB.h"

@implementation SQLiteDB

@synthesize db, dbPath, databaseKey;


//--------------    check for database or create it    ----------------|

+ (void)checkForDatabase  {

    // Get the path to the database file
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString *databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"];

    // Open the database file
    const char *cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding];
    if(sqlite3_open(cDatabasePath, &db) == SQLITE_OK)  {


    }

Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Не имеет заголовка - SQLiteDB.h. Если да, включите его. Иметь указатель на интерфейс в ReadAppDelegate, который инициализируется, и вызывать метод наподобие -

[ instance SQLiteConnection:defaultPath ] ;

Если это часть другого интерфейса, вы не можете объявить его членом текущего интерфейса и получить доступ к другому. Вместо этого передайте сообщение экземпляру.

#import "SQLiteDB.h"
@interface ReaderAppDelegate : NSObject <UIApplicationDelegate> {

    // ....
    SQLiteDB *instance; // You need to dealloc it because it manages resources.
}
0 голосов
/ 09 марта 2011

Вам необходимо импортировать SQLiteDB.h в ваш файл ReaderAppDelegate.m.И убедитесь, что в заголовке SQLiteDB.h объявлено

+ (void)checkForDatabase;

.

Полный пример:

ReaderAppDelegate.h

@class SQLiteDB;

@interface ReaderAppDelegate : NSObject <UIApplicationDelegate> {
     ...
     SQLiteDB *myDB;
}

ReaderAppDelegate.m

#import "SQLiteDB.h"

@implementation
- (void)applicationDidFinishLaunching:(UIApplication *)application {
      myDB  = [SQLiteDB checkForDatabase];
 }

SQLiteDB.h

@interface SQLiteDB : NSObject {
      ...
}

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