2

奇妙な問題に遭遇しました。「pharmacies.sqlite3」というテスト データベースを iPhone プロジェクトに追加しました。そのファイルを iPhone プロジェクトの SUPPORTING FILES フォルダーにコピーしました。

しかし、カスタム db ファイルを iPhone のドキュメント フォルダにコピーしたにもかかわらず、探しているテーブルが存在しないというメッセージが表示されます。それが利用可能であっても。コードを少しリファクタリングしました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

// FMDB

self.databaseName = [[NSString alloc] initWithString:@"pharmacies.sqlite3"];
NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
self.databasePath = [documentsDir stringByAppendingPathComponent:self.databaseName];

[self createAndCheckDatabase];
[self getPharmacies];


}

そして、ここに私のヘルパーメソッドがあります:

- (void)createAndCheckDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:self.databasePath];

if (success) {
    return;
}

NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath]    stringByAppendingPathComponent:self.databaseName]; 
[fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil];
}

- (void)getPharmacies
{
FMDatabase *db = [FMDatabase databaseWithPath:self.databasePath];

[db setLogsErrors:YES];
[db setTraceExecution:YES];

[db open];

FMResultSet *results = [db executeQuery:@"SELECT * FROM pharmacies"];

while ([results next]) {
    NSString *name = [results stringForColumn:@"name"];
    NSLog(@"Apotheke: %@", name);
}
[db close];
}

しかし、まだテーブルがまったく見つかりません..何か見逃しましたか? コピーが機能しなかったというエラー メッセージはありません。

4

4 に答える 4

2

私は同じ問題を抱えていましたが、sqlite データベースが [バンドル リソースのコピー] リスト (プロジェクトを選択してから [ビルド フェーズ] をクリック) に表示されなかったため、残りのリソースと一緒にパッケージ化されていなかったことが問題であることが判明しました。XCode 6 を使用しています。

fmdb open 関数が空のデータベースを作成するとどうなるかと思います。クエリを実行すると、そもそも自分のデータベースがコピーされていないため、テーブルが欠落していると不平を言います。

于 2014-10-12T03:06:30.490 に答える
1

次のように、ファイル名の前にスラッシュを追加してみてください。

NSString *finalDatabasePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory,@"/pharmacies.sqlite3"];

これにより、私が抱えていた同様の問題が修正されました。

于 2012-08-16T20:50:12.760 に答える
0

コードを次のように変更して試してみました。

NSString *finalDatabasePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory,@"pharmacies.sqlite3"];

FMDatabase *database = [FMDatabase databaseWithPath:finalDatabasePath];
[database open];

エラーメッセージは消えますが、新しいメッセージが表示されます:「DB ERROR 1: no such table: pharmacies」

興味深い問題: テーブルは間違いなくそこにあります... しかし、他のソースによると、これは FMDB が pharmacies という名前の新しい DB を作成したことを意味しますが、テーブルはありません。これは、マニュアルによると、その名前のテーブルがない場合に発生します。それで...上記のようにそのdbコピーを作成しました...しかし、docフォルダーにはDBがまったくないようです...?

于 2012-06-10T21:09:51.253 に答える
0

私はこの問題に何時間も苦労しました..部分的には..Mac環境でパスがどのように機能するかを理解していないという事実が原因です..

検索結果のサンプルコードの多くも機能しません..少なくとも私の場合はそうではありません..それを解決する方法は、上部のSQLiteManagerヘッダーパスのデータベースファイルパスをよく見ることです..

/Users/myname/Desktop/delete_later/Xcode Projects/CustomerDB/CustomerDBTests/supplier.sqliteであることが判明しました

次のようにコードにハードコーディングしました。

NSString *writableDBPath = @"/Users/myname/Desktop/delete_later/Xcode Projects/CustomerDB/CustomerDBTests/supplier.sqlite";

db = [FMDatabase databaseWithPath:writableDBPath];
 [db open];

これですぐに問題が解決しました....

于 2012-10-08T03:51:27.607 に答える