Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在iOS xcode中执行select查询时SQLITE\u误用_Ios_Sqlite - Fatal编程技术网

尝试在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中,我想插入到表中时没有任何问题!没问题。很高兴我能帮忙。:)