iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   SQLiteDatabase Library (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/46208-sqlitedatabase-library.html)

markvwijnen 18-10-09 19:13

SQLiteDatabase Library
 
Het gebruik van SQLite binnen een applicatie is erg handig, maar om alles op te zetten kan vrij ingewikkeld zijn en wellicht een drempel om het te gebruiken. Dat moest makkelijker kunnen dacht ik. Ik ben dit weekend begonnen met het opzetten van een static library (dit omdat apple geen custom frameworks toelaat voor de iphone) die alles moest gaan versimpelen. Het idee was dat het extreem makkelijk gemaakt moest worden dat objecten uit de Cocoa Touch framework weg geschreven konden worden naar een database ,en wanneer gewenst, ook weer opgehaald.

Er zijn altijd mensen die dit liever allemaal zelf programmeren, maar ik vind het handig om te gebruiken en vind het leuk om dit te delen. Ben benieuwd wat jullie ervan vinden.

De documentatie en de library zijn hier te vinden:
CrystalMinds’ SQLiteDatabase Library CrystalMinds

Hieronder vind je een voorbeeld van de library in actie.
Code:

// Open een database
SQLiteDatabase *db = [[SQLiteDatabase alloc] initWithFilename:@"database.sql" error:nil];

// Bekijk of de tabel 'movies' bestaat in deze database
if (![db tableExists:@"movies"]) {
    // Indien de tabel 'movies' niet bestaat maak deze dan aan
    [db query:@"CREATE TABLE movies (year INTEGER, name VARCHAR, image BLOB, array BLOB, dict BLOB)" error:nil];
         
    // Voordat we een regel gaan toevoegen aan de tabel definieren we de data die onder elke
    // kolom komt te staan.
    NSMutableDictionary *rowDataDictionary = [[[NSMutableDictionary alloc] init] autorelease];
    [rowDataDictionary setObject:[NSNumber numberWithInt:1999] forKey:@"year"];
    [rowDataDictionary setObject:@"The Matrix" forKey:@"name"];
    [rowDataDictionary setObject:[UIImage imageNamed:@"TheMatrix.jpg"] forKey:@"image"];
    [rowDataDictionary setObject:[NSArray arrayWithObjects:@"Actie", @"Science-Fiction", nil] forKey:@"array"];
    [rowDataDictionary setObject:[NSDictionary dictionaryWithObject:@"Verenigde Staten" forKey:@"country"] forKey:@"dict"];
         
    // Hier is waar de data van de regel daadwerkelijk in de database geplaatst wordt.
    [db insertIntoTable:@"movies" rowData:rowDataDictionary error:nil];
}

// Laat alle regels van de tabel 'movies' in de debug console zien.
NSLog ([[db resultsForQuery:@"SELECT * FROM movies" error:nil] description]);

// Sluit de database netjes af en geef het geheugen vrij
[db release];


JWVD 18-10-09 20:31

Wow, thanks :)
Ik heb SQLite altijd maar ingewikkeld gevonden :p

Whacko 19-10-09 14:35

Ziet er interessant uit :) ik ga er eens naar kijken.

markvwijnen 19-10-09 18:59

Er is toch een klein foutje in geslopen wat ervoor zorgde dat tableExists niet een betrouwbaar antwoord terug geeft. Heb het snel verholpen in versie 1.1.

Frog 20-10-09 11:13

Ik gebruik in een app SQLite en vind het niet zo moeilijk, maar er wordt vaak gezegd dat CoreData beter is, omdat je minder dingen zelf hoeft te programmeren. Ik ben nog niet begonnen met CoreData, maar wat vinden jullie daarvan? Dat is ook een soort library om SQLite of een .plist file heen.

markvwijnen 20-10-09 11:28

Ik wist niet dat met 3.0 CoreDate is geintroduceerd op de iPhone. Weet nog niet wat ik ervan moet vinden op Wikipedia vond ik het volgende:

Citaat:

Core Data is part of the Cocoa API in Mac OS X first introduced with Mac OS X 10.4 Tiger and for the iPhone with iPhone SDK 3.0. It allows data organised by the relational entity-attribute model to be serialised into XML, binary, or SQLite stores.
Van wat ik begrijp organiseer je de data binnen Core Data en sla je het alsnog op in een SQLite database. Persoonlijk ben ik zo opgegroeit met MySQL dat ik het beheren van de data via SQLite op dit moment gemakkelijker vindt dat ik het nog niet de moeite waard vindt om er verder in te verdiepen, maar ben wel heel nieuwsgierig naar jullie ervaringen.

Naast dat ben ik helemaal blij met mn library :D ben er lekker mee aan de slag en het werkt fantastisch.

JWVD 20-10-09 16:00

Mogen we dit eigenlijk in een applicatie gebruiken die we releasen? :p
Met credits uiteraard.

Frog 20-10-09 16:19

Ik vind SQLite ook makkelijker. Als je CoreData gebruikt bouw je in een apart programma de opbouw van je database en link je naar dat bestand in je code. Ik begrijp die code alleen nog niet.

markvwijnen 20-10-09 16:37

Citaat:

Oorspronkelijk geplaatst door JWVD (Bericht 371074)
Mogen we dit eigenlijk in een applicatie gebruiken die we releasen? :p
Met credits uiteraard.

De licentie voor de library laat dit oorspronkelijk niet toe, maar zegt ook dat als je toestemming hebt van de auteur de licentie niet op gaat. Met andere woorden mocht je het echt in een applicatie willen gebruiken stuur dan even een mailtje dan kan ik je toestemming geven ;-)

Ben op dit moment de library aan het uitbreiden met wat handige functies waaronder een shared database die het mogelijk maakt om een gemeenschappelijke database aan te roepen die in je hele applicatie kan bereiken.

Code:

[[CMSQLiteDatabase sharedDatabase] createTable:@"applicationConfiguration" columns:nil error:nil];
En hier zie je ook direct de nieuwe methode createTable voor het snel aanmaken van nieuwe tabellen. Ook ben ik bezig met allColumnsForTable en columnExistsInTable:.

Wordt alleen maar beter :D

markvwijnen 20-10-09 16:39

Citaat:

Oorspronkelijk geplaatst door Frog (Bericht 371089)
Ik vind SQLite ook makkelijker. Als je CoreData gebruikt bouw je in een apart programma de opbouw van je database en link je naar dat bestand in je code. Ik begrijp die code alleen nog niet.

Ben je van plan het dieper uit te zoeken Frog?

Frog 20-10-09 17:49

Misschien, maar eerst wil ik de basis van mijn app afhebben. Misschien zijn er tegen die tijd meer artikelen te vinden op internet. Of wert iemand anders op dit forum hoe het precies werkt?

Whacko 21-10-09 11:22

Wat ik zover over CoreData weet is dat het ongeveer zo werkt als "Hibernate" voor Java. Je maakt een domein model, en CoreData regelt het opslaan, de referenties etc. Dus als jij een class Auto hebt en een class Deur. dan kan je dus dit doen:

[mijnAuto setDeur:mijnDeur];
en dan iets van [coredata save:mijnAuto]; en dan wordt de auto gesaved met een foreign key naar mijnDeur.

(P.S. dit is geen werkende code, alleen een voorbeeld. Onder voorbehoud.)

markvwijnen 22-10-09 23:02

Ja! Versie 2.1 is uit van de SQLiteDatabase Library, op hetzelfde vertrouwde adresje. Alles is nog een stapje makkelijker gemaakt.

Door [CMSQLiteDatabase sharedDatabase]; aan te roepen ben je al helemaal klaar. De functie zorgt dat de datbase wordt aangemaakt en klaar voor gebruik.

Om een tabel aan te maken kunnen we dus in de code direct dit neerzetten:
[[CMSQLiteDatabase sharedDatabase] insertTable:@"nieuweTabel"];

Even alle methodes op een rij:
Code:

Getting the SQLite Database
+ sharedDatabase

Creating SQLiteDatabase Object
- initWithFilename:

Clear the Database
- clearDatabase

Managing Tables
- allTables
- clearTable:
- deleteTable:
- insertTable:
- insertTable:withColumns:
- renameTable:to:
- tableExists:

Managing Columns
- allColumnsForTable:
- allColumnsMetadataForTable:
- columnExists:inTable:
- deleteColumn:inTable:
- insertColumns:intoTable:

Managing Rows
- deleteRowsinTable:
- deleteRowWhereColumn:isEqualTo:inTable:
- insertRow:intoTable:
- rowsOfTable:
- updateRowWithValues:inTable:
- updateRowWithValues:whereColumn:isEqualTo:inTable:

Executing a Query
- lastQuery
- query:
- query:arguments:
- resultsForQuery:
- resultsForQuery:arguments:
- rowForQuery:rowOffset:
- rowForQuery:arguments:rowOffset:
- variableForQuery:column:rowOffset:
- variableForQuery:arguments:column:rowOffset:

Error Handling
- error
- errorFromCode:


SkyTrix 25-10-09 16:40

Ziet er heel erg goed uit! Ik heb nog maar 1x SQLite gebruikt in een project en vond het een echte pain..

Ga hier meteen even mee spelen. Hoe gaat hij trouwens om met grote aantallen queries uitvoeren? Is alles lekker snel? Geen problemen met blocked database bij het uitvoeren van een hoopje queries?

markvwijnen 25-10-09 19:56

De library maakt volledig gebruik van de laatste SQLite versie 3.6.19 en voert ook met die snelheid de queries uit. Dus ja lekker snel ;) Voor de rest moet je er zelf mee spelen ben benieuwd naar je mening, als je suggesties hebt laat ze dan ook vooral weten.

De library is puur een vertaal slag tussen het UIKit Framework en SQLite. Voorheen moest je zelf de functie schrijven die controleert of een database bestaat, zo niet dat deze dan gekopieerd wordt uit je Bundel of dat die er zelf een aanmaakt. Dit alles doet de library al voor je.

Verder om objecten uit het UIKit framework op te slaan in een database en weer uit te lezen had je allerlei truukjes voor nodig, ook dit neemt de library voor je over.

Ook zijn sommige dingen in SQLite niet 'direct' mogelijk. Zoals het opvragen van kolom informatie, of uberhaupt of een tabel bestaat of niet. De library zorgt dat die acties worden uitgevoerd die nodig zijn om die gegevens als nog te achterhalen. Zodat je simpel weg met columnExists en tableExists kan controleren of iets bestaat of niet.

Ook is het fijn te weten dat met de sharedDatabase je overal in je applicatie toegang hebt tot je database.

Heb alweer teveel gelult over de library :) Gewoon zelf proberen, het is makkelijk erin te zetten en ook weer te verwijderen als het je niet bevalt ;)

P-development 25-10-09 20:12

Wat is voordeel ten op zichte van de andere reeds bestaande SQLite wrappers als FMDatabase?

markvwijnen 25-10-09 21:20

Ik ben niet direct bekend met de FMDatabase, maar heb het opgezocht in Google en vond dit
flycode - Project Hosting on Google Code. Ik denk dat je die bedoeld toch?

Er zullen ongetwijfeld een boel andere SQLite wrappers bestaan en uiteindelijk is het de gebruiker/ontwikkelaar die bepaald of die uberhaupt een wrapper nodig heeft en wil gebruiken en welke het fijnst en best werkt.

Dat is waarschijnlijk nog geen antwoord op je vraag, als ik dan een subjectief antwoord mag geven dan denk ik dat mijn library, wrapper of hoe je het ook wilt noemen zich onderscheid door een aantal punten:

- Simpelheid
- Gebruiksvriendelijkheid
- Dankzij tableExists, insertTable, insertColumn, etc. geen specifieke kennis van MySQL nodig om bepaalde taken uit te voeren. Terwijl voor de geavanceerde gebruikers de opties wel blijven bestaan om er meer uit te halen.
- Toegankelijkheid
- Uitgebreide mogelijkheden (Denk hierbij aan de sharedDatabase, maar ook aan allColumnMetadataForTable, het leeg gooien van een tabel, database, het uitschrijven van de database in je console, etc.)

Het enige belangrijke puntje wat nog ontbreekt is snelheid. Het enige wat aan de library nog echt ontbreekt is de mogelijkheid om de statements te cachen.Omwille van het beperkte geheugen van de iPhone heb ik deze functie er bewust uitgelaten omdat het al erg snel werkt zonder. In mijn achterhoofd wilde ik deze functie er wel nog in gooien, en in een volgende release zal dat ook zeker gaan gebeuren zodat deze wrapper ook in die categorie kan meedoen.

Nogmaals, de library is gemaakt vanuit het perspectief dat iemand die geen ervaring heeft met het gebruiken van SQLite toch snel aan de slag kan. Zonder dat die hoeft te snappen waarom een Database gekopieerd moet worden naar de Documenten folder, waarom die query's moet preparen, waarom er een bind functie bestaat, etc.

Ik hoop dat dit antwoord geeft op je vraag.

markvwijnen 26-10-09 18:37

Ik heb zojuist 2.3 gereleased die gebruik maakt van het cachen van statements. Voor de snelheid.

Met maxAmountOfCachedStatements (die standaard op 3 staat) kan je aangeven hoeveel statements er maximaal gecached mogen worden. Als een nieuwe statement zich aanbiedt en het limiet is bereikt dan zal de statement die het minst gebruikt wordt eruit gehaald worden om ruimte te maken voor de nieuwe statement.

Zal verder geen updates meer plaatsen op dit forum om de mensen niet te irriteren die de library niet interessant vinden.

Niels2678 26-10-09 23:34

Ik vind het juist goed dat je vaak updates geeft en deze hier weergeeft. Er zijn een hoop mensen die het moeilijk vinden om te beginnen met SQLite, daarom is juist dit topic handig om beter met SQLite te worden.

Mensen die dit niet interessant vinden kijken toch dan niet.
Keep up the good work..
-----------
Ondertussen ben ik mijzelf ook gaan verdiepen in SQLite met gebruik van deze library. Hij werkt uitstekend!
Veel makkelijker in gebruik dan de standaard sqlite3 library.
Ik raad het iedereen aan, als is het alleen maar om het even te testen!

Matisse 08-11-09 19:44

Ik gebruik zelf geen SQLite meer sinds CoreData in de iPhone SDK zit. Heel snel op te zetten, je hoeft zelf geen queries te schrijven, alle bookkeeping wordt voor jou gedaan (automatisch unlimited undo mogelijkheden, autmatisch gewijzigde entries opslaan,...), fetchen van data wanneer die effectief gebruikt wordt (heel nuttig bij low memory devices zoals iPhone).


Alle tijden zijn GMT +2. Het is nu 03:58.