我正在尝试打开一个随时可以访问的SQLite3
数据库。我创建了一个DBModel
类以及一个DBManager
。 该模型是NSString dbName
、NSString dbPath
和SQLite3 db,以及一个BOOL dbOpened
。
我创建该类的原因是帮助管理我们以前的开发人员创建的大约十几个不同的数据库SQLite
,而不是创建、打开、关闭这些数据库,我决定创建一个管理器来处理所有这些在一个地方。
一个简单的例子是:
if(sqlite3_prepare_v2(dbm.sitesDBModel.db,query , -1, &statement, NULL) == SQLITE_OK) {
if(sqlite3_step(statement) == SQLITE_DONE) {
//do stuff here
}
}
dbm
是DBManager
,siteDBModel
是与我们的网站数据、查询和声明相关的DBModel
,均已预先声明。
我得到的错误是:
使用无效的数据库连接指针进行 API 调用。
在声明 sqlite3 *db 并在同一个代码块中打开它时,我已经看到了这项工作,但我想防止每次我想运行查询时都必须在不同的视图控制器中声明这些变量,这也是我创建类来处理这些任务的原因。
DBModel
@interface DBModel : NSObject {
NSString *dbName;
NSString *dbTempName;
NSString *dbPath;
NSString *dbTempPath;
sqlite3 *db;
BOOL dbOpen;
}
@property (nonatomic, retain) NSString *dbName;
@property (nonatomic, retain) NSString *dbTempName;
@property (nonatomic, retain) NSString *dbPath;
@property (nonatomic, retain) NSString *dbTempPath;
@property (atomic, readwrite) sqlite3 *db;
@property (atomic, readwrite) BOOL dbOpen;
DBManager
@interface DBManager : NSObject {
DBModel *sitesDBModel;
}
@property (nonatomic, retain) DBModel *sitesDBModel;
DBManager 的实现
-(void)createDB:(DBModel *)dbModel {
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath:dbModel.dbPath];
if(!success) {
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbModel.dbName];
[fileManager copyItemAtPath:databasePathFromApp toPath:dbModel.dbPath error:nil];
}
}
-(void)openDB:(DBModel *)dbModel {
sqlite3 *db = dbModel.db;
if(sqlite3_open([dbModel.dbPath UTF8String], &db) == SQLITE_OK) {
dbModel.dbOpen = YES;
}
else {
dbModel.dbOpen = NO;
}
}
您的打开方法是导致问题的原因:
- (void)openDB:(DBModel *)dbModel {
dbModel.db = nil;
sqlite3 *db = dbModel.db;
if(sqlite3_open([dbModel.dbPath UTF8String], &db) == SQLITE_OK) {
dbModel.dbOpen = YES;
}
else {
dbModel.dbOpen = NO;
}
}
如果在打开调用之后立即设置断点并po
db 和 dbModel 的地址.db您将看到 dbModel.db 未指向打开的数据库连接:
(lldb) po db
0x00007fb242c1e500
(lldb) po dbModel.db
<nil>
在建立连接指针后,您需要将其指向打开的连接:
- (void)openDB:(DBModel *)dbModel {
sqlite3 *db = nil;
if(sqlite3_open([dbModel.dbPath UTF8String], &db) == SQLITE_OK) {
dbModel.dbOpen = YES;
// set our pointer to the open connection after establishing
dbModel.db = db;
}
else {
dbModel.dbOpen = NO;
}
}
现在,如果您po
它们应该匹配:
(lldb) po db
0x00007f877bd04a30
(lldb) po dbModel.db
0x00007f877bd04a30