0

我正在模拟器中运行 iOS 程序,但出现此错误

'ISDatabaseSQLiteException',原因:'执行语句失败:'create table GroceryItem(primaryKey integer primary key autoincrement,name text NOT NULL,number integer NOT NULL)' with message: table GroceryItem already exists'

这是我在 AppDelegate.m 中使用的代码

self.database = [[[ISDatabase alloc] initWithFileName:@"db20121207.sqlite"] autorelease];

if(![[database tableNames] containsObject:@"GroceryItem"])
{        
    [database executeSql:@"create table GroceryItem(primaryKey integer primary key autoincrement, name text NOT NULL, number integer NOT NULL)"];    
    [database executeSql:@"insert into GroceryItem (name, number) values('apple', 5)"];    
    [database executeSql:@"insert into GroceryItem (name, number) values('zuoyou', 3)"];
}
else
{
    [database executeSql:@"insert into GroceryItem (name, number) values('apple', 5)"];
    [database executeSql:@"insert into GroceryItem (name, number) values('zuoyou', 3)"];
}

我有这个方法来列出表名sqlite_master

- (NSArray *) tables
{
    return [self executeSql:@"select * from sqlite_master where type = 'table'"];
}

- (NSArray *) tableNames
{
    NSLog(@"%@", [[self tables] valueForKey:@"name"]  );
    NSLog(@"%u", [[[self tables] valueForKey:@"name"] count]  );
    return [[self tables] valueForKey:@"name"];
}

但控制台显示

GroceryList[7439:c07] ("sqlite_sequence")

2012-12-10 16:59:40.305 GroceryList[7439:c07] 1

只得到表sqlite_sequence,计数为1;从上面的异常中,它说“表 GroceryItem 已经存在”

4

1 回答 1

1

我认为这个问题与executeSql方法有关。

从这段代码[[self tables] valueForKey:@"name"]看来,您正在将表名添加到 NSDictionary 对象中。

记住所有的键NSDictionary都是唯一的。您正在使用nameas将所有表名添加到字典中key

所以它会覆盖之前添加的值。这就是为什么它显示一个元素。

解决方案:

  1. 对不同的表名使用不同的键
  2. 使用NSMutableArray代替NSDictionary
  3. 更改您的表创建代码,如:

    [database executeSql:@"create table if not exists GroceryItem(primaryKey integer primary key autoincrement, name text NOT NULL, number integer NOT NULL)"];

如果...其他条件,则不需要那个

于 2012-12-10T09:37:21.747 回答