列表只显示sqlite_sequence

时间:2012-12-10 09:06:57

标签: ios sqlite

我在模拟器中运行iOS程序,我收到此错误

  

'ISDatabaseSQLiteException',原因:'执行语句失败:'创建表GroceryItem(primaryKey整数主键自动增量,名称文本NOT NULL,数字整数NOT NULL)'与mesage:table GroceryItem已经存在'

这是我正在使用的代码,在我的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;从上面的例外情况来看,它说“table GroceryItem已经存在”

1 个答案:

答案 0 :(得分:1)

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

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

请记住NSDictionary中的所有密钥都是唯一的。您正在使用name作为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)"];

  4. 如果......其他条件

    则不需要