0

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が表示されない理由を教えてください。

前もって感謝します。

4

1 に答える 1

0

To Do タスクのリストを最初に表示したとき、それらは画面にレンダリングされます。

データベースへの後続の挿入はデータベースに保存されますが、メイン ページに戻ったときにデータベースから To Do タスクのリストを再フェッチするようアプリに指示していません。

To Do リスト ページの「viewWillAppear」または「viewDidAppear」で、すべての To Do リストを取得するメソッドを記述します。レコードをフェッチするときは、テーブル ビューにレンダリングするために使用する配列に保存してください。

次に、SQL データベースから To-Do リストを取得したら、このメソッドを実行します。

[myTableView reloadData];

これにより、基本的にテーブルがリロードされ、to-do の配列に含まれる新しいレコードが表示されます。

于 2012-09-03T06:21:45.570 に答える