尝试在iOS xcode中执行select查询时SQLITE\u误用
我有一个类来访问我的数据库,当我需要一个实例时,我调用这个函数尝试在iOS xcode中执行select查询时SQLITE\u误用,ios,sqlite,Ios,Sqlite,我有一个类来访问我的数据库,当我需要一个实例时,我调用这个函数 +(DatabaseHelper*) getInstanse { if (!instance) { instance = [[super allocWithZone:NULL] init]; [instance createDatabase]; } return instance; } 下面是createDatabase函数 -(void) createDatabase { NSString *docsDir;
+(DatabaseHelper*) getInstanse
{
if (!instance) {
instance = [[super allocWithZone:NULL] init];
[instance createDatabase];
}
return instance;
}
下面是createDatabase
函数
-(void) createDatabase
{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
// Build the path to the database file
databasePath = [[NSString alloc] initWithString:
[docsDir stringByAppendingPathComponent: databaseName]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
[self createTableProduct];
[self createTableCategory];
[self createTableState];
[self createTableAgency];
[self createTableNews];
[self createTableKnowledge];
[self createTableVideos];
[self createTableProductComment];
sqlite3_close(database);
}
else {
NSLog(@"Failed to open/create database");
}
}
}
我对创建数据库和插入数据库没有问题,但当我想要执行select查询时,它会显示sqlite\u
这是我的选择查询
-(NSMutableArray*) getAllAgencies
{
[self createEditableDatabase];
NSMutableArray *agencies = [[NSMutableArray alloc] init];
NSString *query = [[NSString alloc] initWithFormat:@"SELECT * FROM %@_%@", agencyTable, [Shares getLanguage]];
sqlite3_stmt *statement;
int sqlResult = sqlite3_prepare_v2(database, [query cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL);
if (sqlResult == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
int Id = sqlite3_column_int(statement, 0);
char *nameChars = (char *) sqlite3_column_text(statement, 1);
char *phoneChars = (char *) sqlite3_column_text(statement, 2);
char *addressChars = (char *) sqlite3_column_text(statement, 3);
char *faxChars = (char *) sqlite3_column_text(statement, 4);
char *emailChars = (char *) sqlite3_column_text(statement, 5);
char *detailsChars = (char *) sqlite3_column_text(statement, 6);
int stateID = sqlite3_column_int(statement, 7);
float latitude = (float) sqlite3_column_double(statement, 8);
float longtitude = (float) sqlite3_column_double(statement, 9);
NSString *name = [[NSString alloc] initWithUTF8String:nameChars];
NSString *phone = [[NSString alloc] initWithUTF8String:phoneChars];
NSString *address = [[NSString alloc] initWithUTF8String:addressChars];
NSString *fax = [[NSString alloc] initWithUTF8String:faxChars];
NSString *email = [[NSString alloc] initWithUTF8String:emailChars];
NSString *details = [[NSString alloc] initWithUTF8String:detailsChars];
AgencyData *data = [[AgencyData alloc] init];
[data setId:Id];
[data setName:name];
[data setPhone:phone];
[data setAddress:address];
[data setFax:fax];
[data setEmail:email];
[data setDetails:details];
[data setStateId:stateID];
[data setLatitude:latitude];
[data setLongtitude:longtitude];
[agencies addObject:data];
}
}
sqlite3_finalize(statement);
return agencies;
}
下面是createEditableDatabase函数
- (void) createEditableDatabase {
// Check to see if editable database already exists
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *writableDB = [documentsDir stringByAppendingPathComponent:@"panberes.db"];
success = [fileManager fileExistsAtPath:writableDB];
// The editable database already exists
if (success) return;
// The editable database does not exist
// Copy the default DB to the application Documents directory.
NSString *defaultPath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"panberes.db"];
success = [fileManager copyItemAtPath:defaultPath
toPath:writableDB error:&error];
if (!success) {
NSAssert1(0, @"Failed to create writable database file:'%@'.",
[error localizedDescription]);
}
}
我需要一些帮助我相信问题是在您使用
createDatabase
方法创建数据库后,然后关闭数据库(sqlite\u close(database)
)。您永远不会重新打开数据库来执行sqlite查询。方法[self-createEditableDatabase]
仅在可编辑数据库文件不存在时复制该文件,但不会打开数据库。当您试图运行查询并且没有打开的数据库时,Sqlite将抛出“误用”错误
另外,如果
createDatabase
和createEditableDatabase
处理的是同一个数据库,那么代码中就不清楚了。如果是的话,最好打开数据库,让它保持打开状态,直到您完成操作。多次打开和关闭数据库会导致性能下降。您能解释一下在何处/何时使用getInstance
?还有,为什么每次使用getAllAgencies
时都试图创建一个可编辑的数据库?当然,在getInstance
中,首先需要复制/创建可编辑的数据库,然后在其中创建表。最后一个问题变量数据库在哪里定义和初始化?你要打开它吗?在我的viewdidload中,我调用get instancei,我只是编写它来测试它是否解决了问题(createEditableDatabase),它在@implementation DatabaseHelper中,我想插入到表中时没有任何问题!没问题。很高兴我能帮忙。:)