Objective-C と Sqlite データベースは初めてなので、コードのどこが間違っているのかわかりません。私は単純な Todo リストを作成しています。最初のページでは、すべてのタスクを表示したいのですが、ヘッダーに追加ボタンが 1 つあります。そのボタンをクリックすると、2 番目のストーリーボードに移動します。その中に、メイン タスクとサブタスクを入力できます。TodolistView1Controller という名前の新しいページを作成し、その中でデータベースを作成し、データを db に挿入しました。しかし、私の問題は、メイン ページに戻ったときに、入力した新しいタスクが表示されないことです。以下にコードを貼り付けます:-
TodolistView1Controller.m 内
-(void)viewDidLoad
{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"todo.db"]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &todoDB) == SQLITE_OK)
{
char *errMsg;
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS TODO (ID INTEGER PRIMARY KEY AUTOINCREMENT, MYTASK TEXT, SUBTASK TEXT)";
if (sqlite3_exec(todoDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
{
status.text = @"Failed to create table";
}
status.text = @"Created the database";
sqlite3_close(todoDB);
} else {
status.text = @"Failed to open/create database";
}
} - (IBAction)save:(id)sender {
[myTask resignFirstResponder];
[subTask resignFirstResponder];
sqlite3_stmt *statement;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &todoDB) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO TODO (MYTASK, SUBTASK) VALUES (\"%@\", \"%@\")", myTask.text, subTask.text];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(todoDB, insert_stmt, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
status.text = @"Contact added";
myTask.text = @"";
subTask.text = @"";
} else {
status.text = @"Failed to add contact";
}
NSLog(@"7");
sqlite3_finalize(statement);
sqlite3_close(todoDB);
}
そしてメインViewController.mで
-(void)viewDidLoad
{
const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;
NSLog(@"Display1");
if (sqlite3_open(dbpath, &todoDB) == SQLITE_OK)
{
NSLog(@"Display2");
NSString *querySQL = [NSString stringWithFormat:
@"SELECT MYTASK, SUBTASK FROM TODO "];
NSLog(@"Display3");
const char *query_stmt = [querySQL UTF8String];
NSLog(@"Display4");
if (sqlite3_prepare_v2(todoDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
NSLog(@"Display5");
if (sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(@"Display6");
NSLog(@"Data is displayed");
} else {
NSLog(@"Display7");
NSLog(@"Data cannot be displayed");
}
sqlite3_finalize(statement);
}
sqlite3_close(todoDB);
}
したがって、これを実行するたびに、出力 Display1、Display2、Display3、および Display4 がコンソールに表示されます。出力display5とdisplay6が表示されない理由を教えてください。
前もって感謝します。