我正在为我的iOS应用程序创建一个类来处理我的所有数据库函数。我现在有一个单一的方法来保存数据。在其中,我创建了一个数据库和一个表。然后,我开始保存数据。每次调用此方法时都会发生这种情况。但是,我只处理一个包含单个表的数据库,因此我希望所有这些只发生一次。
#import <sqlite3.h>
#import "LocalDatabase.h"
@implementation LocalDatabase
+ (void)saveData:(id)sender {
/* create database (if it doesnt exist) */
sqlite3 *database = nil;
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"db.sql"];
if(sqlite3_open([path UTF8String], &database) != SQLITE_OK) {
NSLog(@"Failed to open database");
}
/* create table (if it doesnt exist) */
char *err;
NSString *statement = @"CREATE TABLE IF NOT EXISTS DATA (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, CATEGORY TEXT)";
if (sqlite3_exec(database, statement, NULL, NULL, &err) != SQLITE_OK) {
NSLog(@"Failed to create table");
}
/* save data */
// some code that uses database
}
@end
我不太了解静态变量如何在Objective中工作,但我认为以下代码是正确的:
#import "A.h"
@implementation A
static NSString *b = @"TEXT!!";
+ (void) c {
//do stuff with b
}
@end
我相信这只会将@"TEXT!!!"
分配给NSString *b
一次。我以为我可以用它来解决我的问题。但是,我意识到以下内容无法编译:
#import "A.h"
@implementation A
static NSString *b = [NSString stringWithFormat:@"%@",@"TEXT!!!"];
+ (void) c {
//do stuff with b
}
@end
这意味着我不能以这种方式在赋值中进行方法调用。另外,我不能有if语句等。有没有什么方法可以只用static NSString *b = @"TEXT!!";
一次这样做一次?当然,我可以创建一个单独的类方法,仅用于初始化或创建一个静态布尔值,跟踪我是否已初始化,但我想知道是否有更清洁的方法。
答案 0 :(得分:3)
在你的方法中使用这样的东西:
static dispatch_once_t pred;
dispatch_once(&pred, ^{
// stuff to do only once
});
答案 1 :(得分:0)
+ (instancetype)sharedDatabase {
static LocalDatabase *_sharedDatabase = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedDatabase = [[self alloc] init];
});
return _sharedDatabase;
}
它将返回您的类LocalDatabase的实例。