Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone SQLite未正确导入到iOS中_Iphone_Objective C_Sqlite_Fmdb - Fatal编程技术网

Iphone SQLite未正确导入到iOS中

Iphone SQLite未正确导入到iOS中,iphone,objective-c,sqlite,fmdb,Iphone,Objective C,Sqlite,Fmdb,似乎当我将.sqlite3文件复制到iOS中,并使用FMDB访问它时,数据库是空的。我只是将它拖放到Xcode中。当我跑步时: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [docu

似乎当我将.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"];

结果
返回零。查看
[db lastErrorMessage]
,它表示我的表不存在。当我在命令行中打开.sqlite文件(存储在iPhone模拟器中的文件)时,我得到一个空数据库。是否有将SQLite数据库导入iOS的特定方法?如果是,如何解决?

我发现两个可能的问题:

首先,确保.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);
    }
}

我想你也可以把你原来的代码。你只需要打开“db”


谢谢<代码>[self-applicationDocumentsDirectory]找不到。我将其替换为我问题中的前三行。然后我使用了NSString
dbPath
作为路径,我仍然遇到同样的问题。你知道为什么吗?我在上面的三行中替换了你的方法,对吗?如果documents目录中没有DB,那么这段代码只会从捆绑包中复制DB,因此请确保你正在运行新的安装-从你的设备或模拟器中删除应用程序的旧副本。我认为这里发生的部分事情是,
-databaseWithPath:
正在创建一个新的数据库,如果找不到它,就会产生一个空的存储数据库。
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];
}