0

看来,当我将 .sqlite3 文件复制到 iOS 并用于FMDB访问它时,数据库是空的。我只是将它拖放到 Xcode 中。当我运行时:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite3"];
FMDatabase *db = [FMDatabase databaseWithPath:writableDBPath];

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

results返回零。看着[db lastErrorMessage],它说我的桌子不存在。当我在命令行中打开 .sqlite 文件(存储在 iPhone 模拟器中的文件)时,我得到一个空数据库。是否有将 SQLite 数据库导入 iOS 的特定方法?如果是这样,怎么做?

4

2 回答 2

1

我看到两个可能的问题:

首先,确保 .sqlite 文件包含在您的项目目标中。在文件导航器中选择您的文件;打开实用程序面板(显示“查看”部分的右侧面板图标),然后查找标题为“目标成员资格”的部分。如果未选中所需目标的框(您可能只有一个),则您的数据库文件不会被复制到包中。

其次,您试图在文档目录中查找数据库。但是,您必须手动将其从捆绑包复制到该目录,然后才能将其作为可写文件打开:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite3"];

NSURL *dbURL = [NSURL fileURLWithPath:dbPath];

// copy a database from the bundle if not present
// on disk
NSFileManager *fm = [NSFileManager defaultManager];
if (![fm fileExistsAtPath:dbPath]) {
    NSURL *bundlePath = [[NSBundle mainBundle] URLForResource:@"db" withExtension:@"sqlite3"];
    NSError *error = nil;
    if (!bundlePath || ![fm copyItemAtURL:bundlePath toURL:dbURL error:&error]) {
        NSLog(@"error copying database from bundle: %@", error);
    }
}
于 2013-04-07T01:00:28.620 回答
0

我认为您也可以使用原始代码。你只需要打开“db”

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = [paths objectAtIndex:0];
//NSString * documentDirectory = @"/Users/cefitdept/Documents/ImportDB/";

NSString * dbPath = [documentDirectory stringByAppendingPathComponent:@"ImportDB.sqlite"];
FMDatabase * db = [FMDatabase databaseWithPath:dbPath];
if (![db open]) {
    return;
}
FMResultSet * results = [db executeQuery:@"SELECT * FROM main"];
while ([results next]) {
    NSData * data = [results dataForColumn:@"engs"];
    NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
于 2014-02-13T06:34:05.540 回答