2

ユーザー名(Varcharとして)とパスワード(Integerとして)を持つ「dept」という名前のテーブルをsqliteで手動で作成しました。

次のコードを使用してテーブルを更新しました

NSString *database2=[[NSBundle mainBundle]pathForResource:@"deptDatabase" ofType:@"sqlite"];
NSString *databasePath2=[NSString stringWithFormat:@"%@",database2];

const char *dbPath=[databasePath2 UTF8String];
if (sqlite3_open(dbPath, &dbHandler)==SQLITE_OK) {
    NSLog(@"database Opened");
    const char* updateQuery="update dept set password=1234 where username='suren'";
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(dbHandler, updateQuery, -1, &stmt, NULL)==SQLITE_OK) {
        NSLog(@"Query Executed");
    }
}

sqlite3_close(dbHandler);

しかし、テーブルは更新されていないようです。上記のコードを変更してテーブルを更新する方法を教えてください。前もって感謝します

4

2 に答える 2

3

mainBundle のファイルを更新することはできません。これらのファイルは読み取り専用です。

データベースに変更を加えるには、ドキュメント ディレクトリにコピーする必要があります。また、メイン バンドル内のデータベースではなく、ドキュメント ディレクトリ内のデータベースを使用します。そこにファイルがない場合、ドキュメント ディレクトリにコピーされるペイロード ファイルとしてメイン バンドル内のもののみを使用します。


ここで新しい文字列を作成する理由:

NSString *database2=[[NSBundle mainBundle]pathForResource:@"deptDatabase" ofType:@"sqlite"];
NSString *databasePath2=[NSString stringWithFormat:@"%@",database2];

database2と同じdatabasePath2です。ここではメモリを使い果たしているだけです。

于 2012-05-22T09:18:40.253 に答える
3

バンドルからドキュメント ディレクトリにファイルをコピーする

NSString *databaseName = @"YOUR DB NAME WITH EXTENSION";
// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success=[fileManager fileExistsAtPath:databasePath];

if (!success) {

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];  
}

次に、パスdatabasePath(ドキュメントディレクトリ)で作業できます

const char *dbPath=[databasePath UTF8String];
if (sqlite3_open(dbPath, &dbHandler)==SQLITE_OK) {
    NSLog(@"database Opened");
    const char* updateQuery="update dept set password=1234 where username='suren'";
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(dbHandler, updateQuery, -1, &stmt, NULL)==SQLITE_OK) {
        NSLog(@"Query Executed");
    }
}

sqlite3_close(dbHandler);

それが役立つことを願っています..幸せなコーディング:)

于 2012-05-22T10:17:02.160 に答える