2011-05-09 3 views
0

comment créer un fichier SQLite au démarrage de l'application (didFinishLaunchingWithOptions) le test si déjà ou non exsist autrement créer le fichier SQLitecomment créer un sqlite

Répondre

2

Comme ça ... la variable SQLPATH est le chemin d'accès la base de données SQL pré-faites sur votre ressource

- (void) checkAndCreateSQL 
{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[documentPath stringByAppendingString:@"/database.sql"]]) { 
     [[NSFileManager defaultManager] createFileAtPath:[documentPath stringByAppendingString:@"/database.sql"] 
               contents:[NSData dataWithContentsOfFile:sqlPath] 
               attributes:nil]; 
    } 
} 

EDIT 1:

Vous pouvez créer la base de données sur votre Mac en utilisant cette ligne de commande:

sqlite3 database.sql < DATABASE_CREATION.txt 

dans quelque chose DATABASE_CREATION.txt comme ceci:

CREATE TABLE IF NOT EXISTS `group` (
    `id` integer PRIMARY KEY, 
    `name` text, 
    `position` integer 
); 

mettre ensuite directement le fichier database.sql dans votre ressource de projet. (comme une image)

+0

Mais dans ce cas, vous supposez que le fichier à créer est déjà présent, puisque vous utilisez un appel à '[NSData dataWithContentsOfFile: ] '. Où 'sqlPath' devrait-il être? – marzapower

+0

Vérifiez l'EDIT. – TheSquad

+0

Le traitement des bases de données, à moins que des tâches très spécifiques ne le requièrent, devrait être réalisé en utilisant les bibliothèques Core Data, car pour les utiliser, vous n'êtes pas lié à une implémentation SQL spécifique et à des caractéristiques de base de données spécifiques. – marzapower

1

Vous voudrez probablement utiliser les bibliothèques de données de base par défaut au lieu de créer et de gérer manuellement un seul fichier sqlite. S'il vous plaît vérifier le Apple officiel Core Data Programming Guide. Il va gérer automatiquement la création et la mise à jour de la base de données interne dans l'application.

+0

Je suis d'accord que les données de base devraient être dans la plupart des cas l'API utilisée, mais parfois vous avez besoin d'une base de données avec des clés primaires et uniques. sans tracas – TheSquad

+0

Si les données de base ne pouvaient pas facilement gérer les clés uniques ou primaires ... il ne serait pas là. Il utilise simplement une approche entièrement indépendante du SQL, comme c'est le cas dans Hibernate, par exemple. – marzapower

0
sqlite3 *reference2Database() { 
if (_database == nil) { 
    // First, test for existence. 
    NSError *error; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"my.sqlite"]; 

    if ([fileManager fileExistsAtPath:writableDBPath] == NO) { 
     // Database file doesnt exists. Copy the database at writable path (documents directory). 
     NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"my.sqlite"]; 

     [fileManager removeItemAtPath:writableDBPath error:nil]; 

     BOOL databaseCopied = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
     if (!databaseCopied) { 
      // Handle the error... 
     } 
    }else { 
     // Open the database. The database was prepared outside the application. 
     if (sqlite3_open([writableDBPath UTF8String], &_database) != SQLITE_OK) { 
      // Even though the open failed, call close to properly clean up resources. 
      sqlite3_close(_database); 
      _database = nil; 
      // Additional error handling, as appropriate... 
     } 
    } 
} 
return _database; 
} 

// Utilisation de l'échantillon.

-(void) someDatabaseFunction { 
    sqlite3 *database = reference2Database(); 
    // Do something with "database"... 
} 

// Ferme la base de données. Cela devrait être appelé lorsque l'application se termine.

void closeDatabase() { 
if (_database == nil) return; 
// Close the database. 
if (sqlite3_close(_database) != SQLITE_OK) { 
    // Handle the error... 
} 
_database = nil; 

}

NOTE: En haut du fichier, vous devez avoir: sqlite3 statique * _database = nul;

0

J'utilise Matteo Bertozzi's SQLite Wrapper pour créer ma base de données SQLite avec le code suivant:

-(void)checkDatabase 
{ 
    if([[NSFileManager defaultManager] fileExistsAtPath:DBPATH] == NO) 
    { 
     sqlite = [[Sqlite alloc] init]; 

     if (![sqlite open:DBPATH]) return; 

     [sqlite executeNonQuery:@"DROP TABLE yourtable"]; 
     [sqlite executeNonQuery:@"CREATE TABLE yourtable (record1 TEXT NOT NULL, 
                  record2 TEXT NOT NULL, 
                  record3 TEXT NOT NULL, 
                  record4 TEXT NOT NULL);"]; 

     NSArray *results = [sqlite executeQuery:@"SELECT * FROM yourtable;"]; 
     for (NSDictionary *dictionary in results) { 

      for (NSString *key in [dictionary keyEnumerator]) 
       NSLog(@" - %@ %@", key, [dictionary objectForKey:key]); 
     } 

     [results release]; 
     [sqlite release]; 
    } 
} 
Questions connexes