我在模拟器中运行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已经存在”
答案 0 :(得分:1)
我认为该问题与executeSql
方法有关。
从这段代码[[self tables] valueForKey:@"name"]
看来,您正在将表名添加到NSDictionary对象中。
请记住NSDictionary
中的所有密钥都是唯一的。您正在使用name
作为key
将所有表名添加到详细信息中。
所以它会覆盖之前增加的值。这就是它显示单个元素的原因。
<强>解决方案:强>
NSMutableArray
代替NSDictionary
更改表格,创建如下代码:
[database executeSql:@"create table if not exists GroceryItem(primaryKey integer primary key autoincrement, name text NOT NULL, number integer NOT NULL)"];
如果......其他条件
则不需要