私は正常に動作するこの行を持っていました:
"CREATE TABLE IF NOT EXISTS Paths (ID INTEGER PRIMARY KEY AUTOINCREMENT, START INTEGER, END INTEGER, DISTANCE REAL, NODES TEXT)";
ただし、インデックスはありません。開始と終了にインデックスを付けたいと思います。(ルートのノードを取得するのはパスファインダーからです)。
私が今試しているのは:
const char *sql_stmt =
"CREATE TABLE IF NOT EXISTS Paths (ID INTEGER PRIMARY KEY AUTOINCREMENT, START INTEGER, END INTEGER, DISTANCE REAL, NODES TEXT) CREATE INDEX `START_INDEX` ON `Paths` (`START` ASC) CREATE INDEX `END_INDEX` ON `Paths` (`END` ASC)";
しかし、これは失敗します。
理由: "CREATE" 付近: 構文エラー
私はmysqlで少し経験がありますが、sqliteでは経験がありません。これは学校のプロジェクトのためのもので、その後は sqlite に二度と触れないかもしれません。ですから、誰かが少しでも役に立てば、それは本当に素晴らしいことです。私の方法の残りの部分はおそらく最もきれいではありませんが、私はそれについてあまり気にしません。データベースを一度作成し、それを別のプロジェクトにコピーしてそこで使用するだけです。そういうものを拾うための時間と才能がもう少しあれば、もっと時間を費やすだろうが、ATM はできない。誰も助けてくれなくても問題ありません。それは本当に素晴らしいことです。
- (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:@"paths.db"]];
NSLog(@"databasePath: %@", _databasePath);
//NSFileManager *filemgr = [NSFileManager defaultManager];
//if ([filemgr fileExistsAtPath: _databasePath] == NO) {
if (YES == YES) {
const char *dbpath = [_databasePath UTF8String];
if(sqlite3_open(dbpath, &_pathDB) == SQLITE_OK) {
char *errMsg;
const char *sql_stmt =
"CREATE TABLE IF NOT EXISTS Paths (ID INTEGER PRIMARY KEY AUTOINCREMENT, START INTEGER, END INTEGER, DISTANCE REAL, NODES TEXT) CREATE INDEX `START_INDEX` ON `Paths` (`START` ASC) CREATE INDEX `END_INDEX` ON `Paths` (`END` ASC)";
if (sqlite3_exec(_pathDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
{
//_status.text = @"Failed to create table";
NSLog(@"Failed to create table");
NSLog(@"reason: %s", sqlite3_errmsg(_pathDB));
}
sqlite3_close(_pathDB);
} else {
// _status.text = @"Failed to open/create database";
NSLog(@"Failed to open/create database");
}
}
}