2

私は SQLite と iOS がまったく初めてです。iOS で SQLite を使用する方法に関する基本的なチュートリアルに従っています。

http://www.switchonthecode.com/tutorials/using-sqlite-on-the-iphone#comment-11617

上記のリンクでは、データベースを次のように指定しています。

sqlite3 *database;

int result = sqlite3_open("/myExampleDatabase.db", &database);

しかし、データベース名を置き換えて上記のコードを使用すると、後続のアラートビューで指定されたエラーが発生します。

ここでの質問は、データベース ファイルをリソース フォルダーに追加する必要があるかどうかです。そうでない場合、iOS からアクセスできる場所にデータベース ファイルを配置する必要がありますか?

4

3 に答える 3

6

SQLite には FMDB ラッパーを使用することをお勧めします: https://github.com/ccgus/fmdb

于 2012-07-26T07:22:43.953 に答える
4

sqlite データベースを開きたい場合は、次のようにします。

  1. バンドルにデータベースが含まれていることを確認してください。

  2. バンドルからドキュメントにデータベースをプログラムでコピーします (ユーザーがデータベースを変更する場合は特に重要です。読み取りのみを行う場合は、バンドル内のバージョンを開くだけで済みます)。

  3. これをシミュレーターで実行している場合は、バンドルとドキュメント フォルダーを検査して、問題が解決しない場合は、すべてが正しい場所にあることを確認してください。シミュレーターのフォルダーは、「~/Library/Application Support/iPhone Simulator/5.1/Applications/」のようなものです (5.1 は、使用しているシミュレーターのバージョンに置き換えてください)。コマンド ライン ウィンドウchflags nohidden ~/Libraryでを実行して、Library フォルダーを再表示する必要がある場合があります。Terminal

したがって、データベースのパスを取得するためのコード (および、ドキュメントがまだ存在しない場合はそれをドキュメントにコピーするためのコード) は、次のようになります。

NSString *databaseName = kDatabaseName; // obviously, replace this with your database filename, e.g., @"myExampleDatabase.db"

NSString *documentsFolder          = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *databaseFullDocumentPath = [documentsFolder stringByAppendingPathComponent:databaseName];
NSString *databaseFullBundlePath   = [[NSBundle mainBundle] pathForResource:databaseName ofType:@""];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:databaseFullDocumentPath])
{
    NSAssert([fileManager fileExistsAtPath:databaseFullBundlePath], @"Database not found in bundle");

    NSError *error;
    if (![fileManager copyItemAtPath:databaseFullBundlePath toPath:databaseFullDocumentPath error:&error])
        NSLog(@"Unable to copy database from '%@' to '%@': error = %@", databaseFullBundlePath, databaseFullDocumentPath, error);
}

次に、独自の sqlite 呼び出しを行う場合は、次のようになります。

sqlite3 *database;
if (sqlite3_open_v2([databaseFullDocumentPath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
{

    // do whatever you want to do
}

あるいは、FMDB を使用している場合は、次のようになります。

FMDatabase *db = [[FMDatabase alloc] initWithPath:databaseFullDocumentPath];
NSAssert(db, @"Unable to open create FMDatabase");
BOOL success = [db open];
NSAssert(success, @"Unable to open database");
if (success)
{
    // do whatever you want to do
}
于 2012-07-26T17:27:38.230 に答える
0

ただし、ほとんどの場合、以前の回答を完全にサポートします。

sqlite3の代わりに使用する必要がありますCore Dataか?

データベース ラッパー ( fmdb など) をいつ使用するか、いつ を使用するかについての情報を得ることができるいくつかの議論がありますCore Data。(個人的に言えば、私は fmdb を使用するのが大好きですが、常にコードが増え、複雑になり、ほとんどの場合パフォーマンスが低下します)

開始するためのいくつかのリンクCore Data:

于 2012-07-26T13:09:24.237 に答える