Iphone 从未创建SQLite数据库表
我试图创建一个SQLite数据库,但遇到了一个问题,该问题似乎源于从未创建的表CONTACTS(我收到错误消息'error while insert'no-some-table:CONTACTS' '). 从下面的代码中,任何人都能看出什么是错误的,以及如何纠正错误吗?此示例直接取自本指南,这就是为什么我对它不起作用感到惊讶的原因: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;
使用
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;