0

Login.sql という名前の sqlite3 データベース ファイルを、作成中の iPhone アプリケーションに接続しようとしています。Documentsフォルダー、xcodeプロジェクトを含むフォルダー、プロジェクトの派生データなど、いくつかの場所に入れてみましたが、Xcodeはファイルを認識していないようです。次のコードは、didFinishLaunchingWithOptions の下の AppDelegate ファイルにあります (以前はビュー コントローラーにありましたが、動作すると考えて移動しました。

コードは次のとおりです。

NSArray *dirPaths;

// databaseName = [[NSBundle mainBundle] pathForResource:@"DBLogin.sql" ofType:@"db"];

databaseName= @"Login.sql";

// Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(

                                               NSDocumentDirectory, NSUserDomainMask, YES);



docsDir = [dirPaths objectAtIndex:0];


NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDir = [documentPaths objectAtIndex:0];

databasePath = [documentsDir stringByAppendingPathComponent:databaseName];



// Build the path to the database file

//databasePath = [[NSString alloc]                     initWithString: [docsDir stringByAppendingPathComponent:                                     @"DBLogin.sql"]];



NSFileManager *filemgr = [NSFileManager defaultManager];



if ([filemgr fileExistsAtPath: databasePath ] == NO)

{


    const char *dbpath = [databasePath UTF8String];





    if (sqlite3_open(dbpath, &database) == SQLITE_OK)

    {

        NSLog(@"DATABASE LOADED");

        char *errMsg;

        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS User (id varchar(20) PRIMARY KEY , password varchar(20))";



        if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)

        {

            status.text = @"Failed to create table";

        }



        status.text = @"Database Connected";



        sqlite3_close(database);



    } else {

        status.text = @"Failed to open/create database";

    }

}

else{

    NSLog(@"Connect!");

}




return YES;

データベース ファイルにアクセスするコードは次のとおりです

基本的に、このコードに新しいデータベースを配置して、それが問題であるかどうかを確認するたびに、コードはテーブルに作成されたテーブルが存在しない関数で新しい一時SQLデータベースファイルを作成すると思います。どうすればいいのかわからず、これが私を夢中にさせています。このコードを取得して私のデータベースを認識させる方法について誰かが考えている場合は、感謝します。コピー バンドル リソースのビルド ページにリンクされたデータベースが既にありますが、アクセスしません。

他に情報が必要な場合はお知らせください。

前もって感謝します!

4

2 に答える 2

3

データベースにアクセスするための手順を説明しsqlite3ます。

1.まず、必要なテーブルを含む空のsqliteデータベースを作成します(firefox sqlite managerアドオンまたはその他の便利な方法を使用)。そしてそれを私のプロジェクトに追加します。

2.データベースファイルのパスを取得します。

BOOL success;

NSArray*dirPath;
NSString*docDir;
NSString*databasePath;
NSString*databaseName=@"yourDB.sqlite";

//path for database
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docDir=[dirPath objectAtIndex:0];
databasePath=[docDir stringByAppendingPathComponent:databaseName];

3.を使用NSFileManagerして、にすでに存在するかどうかを確認しDocumentDirectoryます。(最初の実行で)存在しない場合は、(最初​​のステップで)バンドルに保存されているデータベースに置き換えます。

//check if present
NSFileManager*fm=[NSFileManager defaultManager];
success=[fm fileExistsAtPath:databasePath];

if(success)
{
   NSLog(@"Already present");
}
else
{

   //Copy from bundle to DocumentsDirectory on first run. Where DB won't be available in DocumentsDirectory.
      NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"yourDB" ofType:@"sqlite"];
NSError*error;
success=[fm copyItemAtPath:bundlePath toPath:databasePath error:&error];

 if(success)
 {
     NSLog(@"Created successfully");
 }

} // End of else when DB not present in documents directory.

これを行うと、バンドルに手動でドキュメントディレクトリに追加した空のDBが作成され、すべての変更が(バンドルではなく)そのDBで実行されます。sqlite3この後、残りのデータベース操作機能に進むことができます。

編集: DBにアクセスする方法

これは私がDBから値を取得するために使用するものです。これを試してみてください。

if(sqlite3_open([dbpath UTF8String], &database)==SQLITE_OK) //Check if it opens properly
{
    NSString*queryStmt=[NSString stringWithFormat:@"select * from sometable"];
    const char*querystmt=[queryStmt UTF8String];
    sqlite3_stmt *statement;

  if(sqlite3_prepare(database, querystmt, -1, &statement, NULL)==SQLITE_OK) // Check if prepare statment has no issues
    {
        while(sqlite3_step(statement)==SQLITE_ROW) // Consists of row.
        {
            NSString*thestring=[[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 0)];// 0 will be first column
            NSLog(@"%@",thestring);
        }

        sqlite3_finalize(statement); //finalize statement
    }

    sqlite3_close(database); //Close database
}
于 2012-07-02T04:07:52.617 に答える
0

問題はデータベースの拡張機能にある可能性があります。iPhone sqlite3 フレームワークはデータベースのみを認識するためLogin.sqliteではなく、呼び出された DB を作成してください。Login.sql.sqlite

その後、コーディングしたものが機能します。

于 2012-07-03T04:07:52.623 に答える