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 食料品リスト[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)"];

その if...else 条件は必要ありません

于 2012-12-10T09:37:21.747 に答える