Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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数据库表_Iphone_Objective C_Cocoa Touch_Cocoa - Fatal编程技术网

Iphone 从未创建SQLite数据库表

Iphone 从未创建SQLite数据库表,iphone,objective-c,cocoa-touch,cocoa,Iphone,Objective C,Cocoa Touch,Cocoa,我试图创建一个SQLite数据库,但遇到了一个问题,该问题似乎源于从未创建的表CONTACTS(我收到错误消息'error while insert'no-some-table:CONTACTS' '). 从下面的代码中,任何人都能看出什么是错误的,以及如何纠正错误吗?此示例直接取自本指南,这就是为什么我对它不起作用感到惊讶的原因: 使用objectAtIndex: sqlite3* _contactDB; NSString *docsDir; NSArray *dirPaths;

我试图创建一个SQLite数据库,但遇到了一个问题,该问题似乎源于从未创建的表CONTACTS(我收到错误消息'error while insert'no-some-table:CONTACTS' ').

从下面的代码中,任何人都能看出什么是错误的,以及如何纠正错误吗?此示例直接取自本指南,这就是为什么我对它不起作用感到惊讶的原因:


使用
objectAtIndex

sqlite3*    _contactDB;
NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];

//Buid the path for database file
  NSString *  _databasePath = [[NSString alloc]
                     initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if([filemgr fileExistsAtPath: _databasePath ] == NO)
{
    const char *db_path = [_databasePath UTF8String];

    if(sqlite3_open(db_path, &_contactDB) == SQLITE_OK)
    {
        char *errMsg;

        const char *sql_stmt =
        "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)";

        if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            NSLog(@"Failed to create table") ;
        }
        sqlite3_close(_contactDB);
    } else { 
       NSLog( @"Failed to open/create database");
    }
}

这段代码没有错——它在MacOSX和iOS模拟器上运行良好。当您尝试向表中插入数据时,是否会出现错误?在尝试向文件中插入数据之前是否关闭该文件

在模拟器中运行它,逐步完成代码,然后在模拟器的Documents目录中找到该文件。使用终端查看文件中的内容:

sqlite3 path-to-file .dump
具体路径在您的机器上会有所不同,但在我的iOS模拟器中,我得到:

sqlite3 "/Users/my-login-name/Library/Application Support/iPhone Simulator/6.1/Applications/DAD0BB47-2136-4367-8DAF-AA578D0C00A5/Documents/contacts.db" .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT);
COMMIT;

您可以看到该表的列是正确的。

虽然可以使用objectAtIndex,但Objective-C最新版本中的[0]没有问题。为什么-ve投票代码在我的系统上运行良好(base sdk Mac osx 10.5)您可能希望从设备/模拟器中删除该应用程序,然后重新运行该应用程序,因为如果您以前运行过此代码,但create fable失败,则db将保留在您的documents文件夹中(因此,您再也不会点击create table语句)。下面的行看起来不太好。NSString*insertSQL=[NSString stringWithFormat:@“插入到联系人(名称)值(\“%@”)中”,名称保存]是的,当我尝试将数据插入到表中时出错(上面代码中的saveName方法)。所以我猜错误就在那里的某个地方。我只是不确定它是什么。对不起,我没有看到其他例程。这段代码在模拟器下也可以正常运行。我可以插入数据并在以后查看。是否确定self.text.text包含要添加的字符串?如果没有其他内容,请从模拟器中删除该应用程序,然后重试。也许Rob是对的,但由于某种原因,现有文件无效。使用sqlite3dump命令检查该表,以查看该表的外观。
sqlite3 "/Users/my-login-name/Library/Application Support/iPhone Simulator/6.1/Applications/DAD0BB47-2136-4367-8DAF-AA578D0C00A5/Documents/contacts.db" .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT);
COMMIT;