簡體   English   中英

FMDB 錯誤 1:沒有這樣的表

[英]FMDB ERROR 1: no such table

我遇到了一個奇怪的問題。 我剛剛在我的 iPhone 項目中添加了一個名為“pharmacies.sqlite3”的測試數據庫。 我已將該文件復制到我的 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];
}

但是仍然沒有找到任何桌子......我錯過了什么嗎? 沒有錯誤消息表明復制將不起作用....

我遇到了同樣的問題,結果發現問題是 sqlite 數據庫沒有出現在 Copy Bundle Resources 列表中(在選擇項目下,然后單擊 Build Phases),因此它沒有與其余資源一起打包。 我正在使用 XCode 6。

我認為發生的情況是 fmdb open 函數創建了一個空數據庫。 當您查詢時,它會抱怨您的表丟失,因為您自己的數據庫從未首先被復制。

嘗試在文件名前添加一個正斜杠,如下所示:

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

這解決了我遇到的類似問題。

我只是通過將代碼更改為:

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

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

現在錯誤消息消失了,但出現了一個新消息:“DB ERROR 1: no such table: pharmacies”

有趣的問題:該表肯定存在......但根據其他來源,這意味着 FMDB 創建了一個名為 pharmacies 的新數據庫,但沒有任何表。 這是根據手冊發生的,當沒有具有該名稱的表時。 所以......我做了那個數據庫副本,你可以在上面看到......但是doc文件夾中似乎根本沒有數據庫......?

我在這個問題上掙扎了幾個小時..部分原因是..我不明白路徑在 mac 環境中是如何工作的(來自 MS/Visual Studio 背景)..

搜索結果中的許多示例代碼也不起作用..至少在我的情況下..所以我解決它的方法是仔細查看頂部 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];

這立即為我解決了問題......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM