2012-05-04 20 views
0

テキストフィールドからの入力を受け取り、それを文字列に変換するアプリケーションを開発中です。私は、データベースのフィールドの値との入力から文字列の値をチェックするフィールドを持つテーブルを持っています。私はiOSには新しく、SQLiteはかなり新しいです。データベースが見つかりません... 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(@" %の@にsqliteのデータベースをオープンになる "DatabasePathに);"、それがデータベースへのアクセス権を持っているかのように見えます。しかし、私はアプリを実行すると、私は "NSLog(@ SQLの問題が発生した:%s"、SQL); "エラー、私はコンソールで見ることができます。さらに、コンソールに「No such table:tblStore」と表示されます。

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

ご迷惑をおかけして申し訳ございません。ありがとう!

EDIT:プロジェクトにファイルを正しく追加しました。テーブルが見つかったかのように表示されます。今でも、私はいくつかの奇妙な警告を持っている:

この警告は、次のように表示される「互換性のないポインタ型は 『sqlite3_stmtの*』(別名 『構造体sqlite3_stmt *』)タイプのパラメータに 『のconstのchar *』を渡します」コード行:

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」とは関係がありますが、わかりません。助言がありますか?

+0

Core Dataを検討する価値はありません。 – runmad

+0

提案をいただきありがとうございますが、CoreDataを使用することは私の選択ではありません。私はSQLiteを使用するよう指示されています。ありがとう! – Skizz

+0

申し訳ありませんが、コアデータはかなり素晴らしいです:)それはあなたがsqliteデータベースをインポートすることができます。がんばろう。 – runmad

答えて

3

あなたのコードは大丈夫です - あなたのプロジェクトのressourceフォルダにdbをコピーしましたか?

EDIT

は、あなたがそのようなもので、あなたの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)); 
     } 

} 
+0

面白いことに、あなたはそれを聞いています。私は数ヶ月前(4-5ヶ月)にリソースフォルダに気付いていましたが、Xcodeをアップデートして以来、リソースフォルダは表示されません。私は、既存のテーブル(私はXcodeの外で、FirefoxのアドオンSQLite Managerを使用して作成)をドロップし、私の.xib、ViewController.h、ViewController.m、AppDelegate.hを含む私のメインフォルダにドロップしました。 and AppDelegate.m – Skizz

+1

申し訳ありません私はressourceフォルダが含まれている私のプロジェクトをチェックしていたが、それは基本的に自分自身を作成し​​たフォルダです。プロジェクトに必要な場所にdbを置くことができます。ビルドフェーズ/コピーバンドルソースの下でプロジェクトをクリックすると、ファイルが自動的に追加されることを確認してください。 – tiguero

+0

私のプロジェクトフォルダをFinderで見ると、プロジェクトフォルダにtblStore.sqliteが表示されます。ビルドフェーズ>コピーバンドルの下を見ると、XcodeにtblStore.sqliteフォルダが表示されません。これが私が困っているところですか?コピーバンドルにtblStore.sqliteファイルを追加する必要がありますか?返信と助けてくれてありがとう!とても有難い! – Skizz

1

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

必要な作業を行うには、データベースにアクセスする前にメインバンドルからドキュメントフォルダにデータベースをコピーする必要があります。それ以外の場合は、ドキュメントのフォルダでSQLite DBを見つけることができません。

+0

私はiOSにはかなり新しいので、あなたは私の無知を言い訳しなければなりません。私はこれをどのように達成できるかについてのステップを提供してもらえますか?または、少なくとも私が従うことができるリソース/チュートリアルのsoeソートを提供する?ありがとう! – Skizz

+0

ファイルをビルドフェーズ>コピーバンドルリソースで追加することで、バンドルにファイルを追加できました。助けてくれてありがとう!! – Skizz

0

ファインダで[OK]をクリックすると、データベースをコピーしてファインダをクリックし、このアドレス(/ Users/Administrator/Library/Application Support/iPhone Simulator/6.1/Applications /)を書き込むことができます。 ドキュメンタリーパスを取得します。 プロジェクト文書ファイルを開き、データベースを貼り付けてください。

関連する問題