Requêtes relationnelles entre plusieurs bases SQLite

muqaddarmuqaddar Administrateur
mai 2011 modifié dans Objective-C, Swift, C, C++ #1
Salut,

Ma question est simple: y-a-t-il un moyen technique de faire des requêtes relationnelles entre des tables provenant de 2 bases sqlite (et non 1 seule ce qui est enfantin).

Donc existe-t-il un moyen de faire croire que toutes les tables sont dans la même base, ce qui implique sûrement une double connexion permanente...

Réponses

  • Eddy58Eddy58 Membre
    14:44 modifié #2
    C'est possible, avec une requête ATTACH DATABASE : http://www.sqlite.org/lang_attach.html
  • muqaddarmuqaddar Administrateur
    mai 2011 modifié #3
    Salut Eddy !

    Très content de te revoir ! :)

    Merci pour le lien, ça a l'air très simple.
    C'est intéressant :
    - pour pouvoir séparer les données privées (bundle) des données publiques (de la sandbox)
    - ça permet de mettre à  jour les données privées en changeant la DB simplement (plutôt que de devoir la mettre à  jour par des requêtes si les tables étaient dans la DB de la sandbox)
  • Eddy58Eddy58 Membre
    14:44 modifié #4
    Salut Alex,

    moi aussi, content de retrouver un peu de disponibilité, pourvu que ça dure.  :)

    Oui c'est en effet très intéressant pour les cas que tu cites, et plus généralement pour lier une base en mode read only, et une autre base avec des tables sujettent à  des modifications plus ou moins intenses. Ca peut aussi servir pour fragmenter une base trop volumineuse en plusieurs morceaux (pour les petites configurations), et ne se servir ainsi que de certaines bases selon les cas. 
  • muqaddarmuqaddar Administrateur
    novembre 2011 modifié #5
    Bon, j'ai fait un test dans un nouveau projet.
    J'avais peur que ça ne marche pas car j'utilise le framework FMDatabase pour simplifier la création des requêtes.

    Donc voilà  un peu de code:
    - une base dans le bundle qui contient la table 'countries' (données communes)
    - une base dans la sandbox qui contient la table 'wines' (données user)

    &nbsp; // paths<br />&nbsp; NSString *bundlePath = [[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@&quot;bundle&quot;] stringByAppendingPathExtension:@&quot;sqlite&quot;];<br />&nbsp; NSString *sandboxPath = [[kDOCUMENTS_PATH stringByAppendingPathComponent:@&quot;sandbox&quot;] stringByAppendingPathExtension:@&quot;sqlite&quot;];<br /><br />&nbsp; FMDatabase *bundleDB;<br />&nbsp; <br />	if ([[NSFileManager defaultManager] fileExistsAtPath:bundlePath])<br />	{<br />		bundleDB = [FMDatabase databaseWithPath:bundlePath];<br />		if (![bundleDB open]) NSLog(@&quot;Could not open bundleDB.&quot;); <br />	}&nbsp; <br />&nbsp; <br />&nbsp; [bundleDB executeUpdate:[NSString stringWithFormat:@&quot;ATTACH DATABASE &#039;%@&#039; AS db2&quot;, sandboxPath]];<br />&nbsp; <br />&nbsp; FMResultSet *dbRows = [bundleDB executeQuery:@&quot;SELECT wines.winery, countries.fr_name FROM wines, countries WHERE wines.country_id = countries.id&quot;];<br />&nbsp; while ([dbRows next]) <br />&nbsp; {<br />&nbsp; &nbsp; NSLog(@&quot;%@ - %@&quot;, [dbRows stringForColumn:@&quot;winery&quot;], [dbRows stringForColumn:@&quot;fr_name&quot;]);<br />&nbsp; }
    


    Ce qui donne :

    2011-05-20 09:46:23.410[67891:207] Château Prieuré de Bubas - France
    2011-05-20 09:46:23.412[67891:207] Domaine Val Auclair - France
    2011-05-20 09:46:23.412[67891:207] Domaine Boucabeille - France
    2011-05-20 09:46:23.413[67891:207] Domaine Boucabeille - France
    2011-05-20 09:46:23.413[67891:207] Bodega Altanza - Espagne
    2011-05-20 09:46:23.414[67891:207] Cartlidge & Browne - Etats-Unis
  • Eddy58Eddy58 Membre
    14:44 modifié #6
    Plus qu'à  optimiser tout ça avec cette trouvaille maintenant ;)
Connectez-vous ou Inscrivez-vous pour répondre.