2012-12-10 34 views
0

我在模擬器上運行的iOS版本的程序,我得到這個錯誤名單表只顯示sqlite_sequence

「ISDatabaseSQLiteException」,理由是:「無法執行語句:」創建表GroceryItem(PrimaryKey的整數主鍵自動遞增,名稱文本NOT NULL,數整數NOT NULL)」與mesage:表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;從上面的例外情況來看,它說「表GroceryItem已經存在」

回答

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)"];

不會有這種需要,如果...其他條件