0

テキストフィールドから入力を受け取り、それを文字列に入れるアプリに取り組んでいます。入力からの文字列の値をデータベースのフィールドの値と照合するフィールドを含むテーブルがあります。私はiOSに不慣れで、SQLiteにはかなり不慣れです。

コード:

-(IBAction)setInput:(id)sender
{
NSString *strStoreNumber;
NSString *strRegNumber;

strStoreNumber = StoreNumber.text;
strRegNumber = RegNumber.text;
lblStoreNumber.text = strStoreNumber;
lblRegNumber.text = strRegNumber;

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString* documentsDirectory = [paths lastObject];
//    NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"];
NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
{

    NSLog(@"Opened sqlite database at %@", databasePath);

    //...stuff
} 
else 
{
    NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database));
    sqlite3_close (database);
}

NSString *querystring;

// create your statement
querystring = [NSString stringWithFormat:@"SELECT strStore FROM tblStore WHERE strStore = %@;", strStoreNumber];  

const char *sql = [querystring UTF8String];

NSString *szStore = nil;
NSString *szReg = nil;


if (sqlite3_prepare_v2(database, sql, -1, &databasePath, NULL)!=SQLITE_OK) //queryString = Statement
{
    NSLog(@"sql problem occured with: %s", sql);
    NSLog(@"%s", sqlite3_errmsg(database));
}
else
{
    // you could handle multiple rows here

    while (sqlite3_step(databasePath) == SQLITE_ROW) // queryString = statement
    {            
        szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(databasePath, 0)];
        szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(databasePath, 1)];
    } // while        

}

sqlite3_finalize(databasePath);

// Do something with data...  
}

「NSLog(@ "Openedsqlite database at%@"、databasePath);」という行に到達するため、データベースにアクセスできるように見えます。ただし、アプリを実行すると、「NSLog(@ "sql問題が発生しました:%s"、sql);」が表示されます。エラー。コンソールに表示されます。さらに、コンソールには「そのようなテーブルはありません:tblStore」と表示されます。

FirefoxアドオンのSQLiteManagerを使用してテーブルを作成しました。プロジェクトにsqlite3ライブラリを追加しました。SQLiteマネージャーで作成したデータベーステーブルをプロジェクトの2つのAppDelegateファイルと2つのViewControllerファイルの上にドラッグアンドドロップしました。

ヘルプや入力をいただければ幸いです。ありがとう!

編集:ファイルをプロジェクトに適切に追加しましたが、テーブルが見つかったように見えます。しかし、今、私はいくつかの奇妙な警告があります:

"タイプ'sqlite3_stmt*'(別名'struct sqlite3_stmt *')のパラメーターに'constchar*'を渡す互換性のないポインタータイプ"

この警告は、次のコード行に表示されます。

if (sqlite3_prepare_v2(database, sql, -1, &databasePath, NULL)!=SQLITE_OK)

while (sqlite3_step(sql) == SQLITE_ROW)

szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(sql, 0)];

szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(sql, 1)];

sqlite3_finalize(sql);

「sql」と関係がありますが、よくわかりません。助言がありますか?

4

3 に答える 3

3

コードは問題ないようです-データベースをプロジェクトのリソースフォルダにコピーしましたか?

編集

次のようなものでdbファイルにアクセスするようにしてください。

    - (void) initializeDB {

        // Get the database from the application bundle
        NSString* path = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];

        if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
        {
            NSLog(@"Opening Database"); 
        }
        else
        {
            // Call close to properly clean up
            sqlite3_close(database);

            NSAssert1(0, @"Error: failed to open database: '%s'.", 
                      sqlite3_errmsg(database));
        }

}
于 2012-05-04T17:53:52.613 に答える
1

プロジェクトに追加するデータベースファイルは、メインに埋め込まれますNSBundle(を参照[NSBundle mainBundle])。

やりたいことをするためには、データベースにアクセスする前に、データベースをメインバンドルからドキュメントフォルダにコピーする必要があります。そうしないと、経験しているように、ドキュメントのフォルダーでSQLiteDBを見つけることができません。

于 2012-05-04T17:56:19.240 に答える
0

データベースをコピーし、ファインダーをクリックして、ファインダーの[OK]をクリックしてこのアドレス(/ユーザー/管理者/ライブラリ/アプリケーションサポート/iPhoneシミュレーター/6.1/アプリケーション/)を書き込むことができます。ドキュメンタリーパスを取得します。プロジェクトドキュメントファイルを開き、データベースを貼り付けます。

于 2014-01-20T07:26:45.170 に答える