次の関数を使用してデータベースをチェックおよび作成しています。
-(void) checkAndCreateDatabase
{
// Check if the SQL database has already been saved to the users phone, if not then copy it over
BOOL dbExists;
// Create a FileManager object, we will use this to check the status
// of the database and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];
// Check if the database has already been created in the users filesystem
dbExists = [fileManager fileExistsAtPath:_databasePath];
// If the database already exists then return without doing anything
if(dbExists)
{
//sqlite3_open([self.databasePath UTF8String], &_database);
NSLog(@"DB DOES EXIST");
return;
}
NSLog(@"DB DOES NOT YET EXIST");
// If not then proceed to copy the database from the application to the users filesystem
// Get the path to the database in the application package
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:_databaseName];
// Copy the database from the package to the users filesystem
[fileManager copyItemAtPath:databasePathFromApp toPath:_databasePath error:nil];
}
データベース名とパスは、私の Search クラスの init 関数で、ここで適切に設定されています。
- (id)init
{
if ((self = [super init]))
{
_databaseName = DB_NAME;
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
_databasePath = [documentsDir stringByAppendingPathComponent:_databaseName];
if (sqlite3_open([_databasePath UTF8String], &_database) != SQLITE_OK)
{
[[[UIAlertView alloc]initWithTitle:@"Missing"
message:@"Database file not found"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil]show];
}
}
return self;
}
次に、次を使用してデータベースにクエリを実行します。
-(void)search:(NSString *)searchTerm
{
const char *dbpath = [_databasePath UTF8String];
sqlite3_stmt *statement;
/* Begin Database Work */
if(sqlite3_open(dbpath, &_database) == SQLITE_OK)
{
NSString *querySQL = @"SELECT * FROM types";
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(_database, query_stmt, -1, &statement, NULL))
{
if(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog([[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement,1)]);
}
else
{
NSLog(@"nope2: query = ");
printf(query_stmt);
}
}
else
{
NSLog(@"nope1");
}
}
}
私は常に「nope2」を返しています。これは、結果が返されていないことを意味しているようです。ただし、SQLite のデータベースに対してまったく同じクエリを直接実行すると、期待どおりの結果が得られます。これにより、コードで何か間違ったことをしていると信じるようになります。ここで何が問題に見えますか?