Det viktigaste för att bemästra hur man utvecklar iOS-appar för iPhone och iPad med SQlite |

(c) klanguedoc, 2011

iOS och SQLite utgör en kraftfull kombination för att bygga data ihållande iPad-, iPhone- eller iPod Touch-mobilapplikationer. IOS SDK ger ursprungligt stöd för SQLite genom att använda C-programmeringsspråket. Denna handledning leder dig genom hur du konfigurerar en SQLite-databasapplikation och läser text och bilder från databasen till en scen.

Skapa databasen


Till att börja med behöver du FireFox från Mozilla och SQLite Database Manager-plugin. Om du inte har dem kan de laddas ner och installeras från FireFox webbplats. När FireFox har installerats installerar du SQLite Manager från Add-on Manager.

SQLite Manager kan startas från Firefox-menyn eller Verktyg-menyn beroende på vilken version du använder (se figur 1).

Bild 1: SQLite Manager i Firefox

Klicka på den nya databas-knappen (figur 2) för att skapa en ny databas. Du kan ge vilket meningsfullt namn du vill ha. Observera att SQLite-tillägget läggs automatiskt till. Du blir ombedd att spara filen i filsystemet (naturligtvis). Observera var du sparar den eftersom du kommer att kopiera filen senare till ditt projekt.

Nästa, klicka på den nya tabellknappen (figur 3) för att skapa en ny tabell, igen kommer jag att lämna det upp till dig att namnge det något användbart. För den här självstudien har jag namnet tabellen wineTbl och jag har skapat fyra kolumner: id [primär, autoinc, heltal], vinnamn [varchar], winerating [varchar] och vinimage [blob].

  • Hur man utvecklar iOS-databasappar med SQLite
    Denna bok kommer att lära dig hur du utvecklar iOS-appar med SQLite. Boken innehåller prisbelönta artiklar som tidigare publicerats online som har samlat ungefär 1 miljon sidvisningar och nytt originalinnehåll

Bild 2: Skapa en tabell

Bild 3: Skapa de nödvändiga kolumnerna

För denna tutorials skull kommer jag att förbehandla databasen med några vinposter och bilder från webben. Du kan lägga till data genom att välja tabellen och välja fliken Bläddra och data. För att ladda upp en bild, klicka på pappersklippsikonen bredvid klumpfältet. (Figur 4 och figur 5).

Nu kan du också stänga databasen från Firefox-menyn och Firefox eftersom vi inte behöver längre för handledning.

Bild 4: Lägga till en ny post i databasen

Bild 5: Registreringslista i databasen

Skapa IOS 5-projekt


Starta XCode 4.2 och skapa en IOS 5-applikation med en vy. Ge det ett meningsfullt namn och välj Storyboard och ARC. Ställ in din Git, eller inte, källkontroll och slutföra skapandet av ditt projekt. (figur 6).

Bild 6: Appen Vinlista

Konfigurera SQLite


Expandera mappen Ramverk, högerklicka på en av ramarna och välj Visa i Finder för att öppna Finder på ramplatsen. Du måste lägga till libsqlite_3.0.dylib-filen till ditt projekt (figur 6), så flytta upp två eller tre nivåer (se Gå till mappen Enclosing i Finder-menyn) tills du kommer till mappen usr. Öppna den och öppna lib-mappen. Rulla ner tills du hittar sqlite_3.0.lib. Dra filen till dina ramverk och se till att INTE kopiera filen till ramarna, men skapa ENDAST en referens (figur 7).

Välj sedan projektroten, högerklicka och välj Visa i Finder. Leta reda på din SQL-databas som du skapade i den första delen av den här tutorialen och kopiera den till projektgruppen där du projicerar rubrik- och implementeringsfiler (figur 8).

Bild 7: Kopiera referens av sqlite3.0.dylib till mappen Framework

Bild 8: Kopiera databasfilen till projektmappen

Konfigurera DAO-operationer


Skapa en ny grupp (File | New Group) eller från (Context Menu | New Group). Namnge det "Model". Skapa sedan två Objekt-C-implementeringsfiler och motsvarande sidfiler. Välj modellgrupp och från Arkiv-menyn eller snabbmenyn | välj Ny fil. Välj Objekt-C-noden och sedan Objekt-C-klassmallen.

Ge din fil ett namn: WineList (om du följer denna handledning), välj NSObject som underklass och skapa filen. Upprepa processen för nästa uppsättning filer: MyWineList, (eller du kan välja ett namn som WinesDAO). Välj igen NSObject som underklass och skapa filen (figur 9).

Skapa fyra egenskaper i filen WineList.h (rubrik), en för varje kolumn i wineTbl (figur 10):

  • wineId
  • vin
  • betyg
  • Foto


Öppna sedan filen WineList.m (implementering) för att ställa in getter och setter-metoderna. Så din WineList bör innehålla fyra @synthesize-uttalanden, en fyra varje egenskap (figur 11).

  • @synthesize vinId;
  • @ syntetiserar vin;
  • @ synthesize-betyg;
  • @synthesize photo;

Bild 9: Skapa klassen WineList

Bild 10: Skapa klassen Vinlistor
Bild 11: WineList-rubriken

Skapa CRUD-operationer


Tja CRUD är lite av en sträcka. För denna handledning är det egentligen bara en R (läs) operation. Ok nu kommer applikationen att behöva DAO-klasser för CRUD (Read) -operationerna, så om du inte redan har gjort det, skapa en ny Objekt-C-klass: MyWineLists eller vad du vill så länge som deklarationen och implementeringen Arbetar. För MyWineLists rubrikfil förklaras ett sqlite3-objekt och en NSMutableArray-metod (figur 11):

  • db
  • getMyWines



För att implementera dessa objekt öppnar du filen MyWineLists.m. I den här filen, tarmen om operationerna kommer att ske.

För att börja skapa NSMutableArray-metoden getMyWines och lägga till en array-pekarvariabel:

  • wineArray



Förklara sedan ett NSFileManager-objekt, ett NSString-objekt och ett Bool-objekt:

  • fileMgr
  • dbPath
  • Framgång




NSMutableArray * wineArray = [[NSMutableArray alloc] init];
@Prova {
NSFileManager * fileMgr = [NSFileManager defaultManager];
NSString * dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @ "IOSDB.sqlite"];
BOOL framgång = [fileMgr fileExistsAtPath: dbPath];
...

DbPath kommer att innehålla filnamnet och sökvägen för SQLite-databasen som kommer att skickas till filenMgr. Om filen finns kommer framgången att vara sann. Nästa test för att se om filen fanns och om inte loggar ett fel. Följande åtgärd försöker öppna databasen, sqlite3_open innan du ställer in Select-sats och sql3_stmt:

  • sQL
  • SQLStatement




if (! framgång)
{
NSLog (@ "Kan inte hitta databasfilen '% @'.", DbPath);
}
if (! (sqlite3_open ([dbPath UTF8String], & db) == SQLITE_OK))
{
NSLog (@ "Ett fel har inträffat.");
}
const char * sql = "VÄLJ ID, vin, betyg, foto FRÅN WineTbl";
sqlite3_stmt * sqlStatement;
if (sqlite3_prepare (db, sql, -1, & sqlStatement, NULL)! = SQLITE_OK)
{
NSLog (@ "Problem med att förbereda uttalande");
}
...

Om databasen framgångsrikt öppnas kommer sqlite3_prepare att försöka köra sqlStatement. Om uttalandet framgångsrikt körs vilket resulterar i att en resultatset returneras, kör sedan en stund-slinga för att korsa resultatuppsättningen tilldela värdena till NSMutableArray-fälten.

...
medan (sqlite3_step (sqlStatement) == SQLITE_ROW) {
WineList * MyWine = [[WineList alloc] init];
MyWine.wineId = sqlite3_column_int (sqlStatement, 0);
MyWine.wine = [NSString stringWithUTF8String: (char *) sqlite3_column_text (sqlStatement, 1)];
MyWine.rating = [NSString stringWithUTF8String: (char *) sqlite3_column_text (sqlStatement, 2)];
const char * raw = sqlite3_column_blob (sqlStatement, 3);
int rawLen = sqlite3_column_bytes (sqlStatement, 3);
NSData * data = [NSData dataWithBytes: raw length: rawLen];
MyWine.photo = [[UIImage alloc] initWithData: data];
[wineArray addObject: MyWine];
}
}
@catch (undantag från NSE * *) {
NSLog (@ "Ett undantag inträffade:% @", [undantagsskäl]);
}
@till sist {
returnera vinArray;
}

...

Detta tar ganska mycket hand om cRud-verksamheten. Nästa steg kommer att involvera installation av UI, skapa IBActions och IBOutlets-anslutningar. (Se figur 12, 13).

Bild 12: Implementeringen av vinlistor

Bild 13: CRUD-operationerna

Skapa användargränssnitt



Börja med att hitta och öppna storyboard-filen. Du bör ha en enda tom scen (View Controller). För denna del krävs fyra etiketter (UIL-märkning): en för vinnamn och värdet från databasen och på samma sätt för de två andra: en för vinbetyg och motsvarande värde från databasen som kommer att lagras i NSMutableArray. För bilderna drar du en UIImageView till scenen. Som ett sista steg för användargränssnittet drar du en UIToolbar och placerar den längst ner på skärmen och byter namn på den medföljande knappen: Nästa flaska (figur 14).

Bild 14: Ansluta prickarna
Bild 15: Projektstrukturen

För att avsluta appen måste viss kod läggas till i ViewController-rubriken och implementeringsfilerna. Så för att ställa in IBAction och IBOutlet, öppna rubrikfilen längs storyboard genom att klicka på Assistant Editor, ansiktsikonen i verktygsfältet (figur 14). Börja med att välja den första etiketten och dra en anslutningsrad (Ctrl + vänster musknapp) till rubrikfilen mellan den sista lockiga stången och @end-direktivet. I popup-fönstret, välj IBOutlet och ange ett namn som: vinnamn. Fortsätt med den andra etiketten som kommer att innehålla betygsinformationen. Detta kommer också att vara en IBOutlet och namnet kommer att vara: winerating. För bilden, upprepa samma operation som de två föregående. Denna anslutning kommer också att vara en IBOutlet och namnet kommer att vara: vinViewer. Dra slutligen en anslutningsrad från knappen i verktygsfältet. Detta kommer att vara en IBAction och namnet på metoden: GetWineListing. Lägg också till ett NSMutableArray-objekt:

  • viner



Du borde ha lite fyllt i punkt i marginalen som indikerar att anslutningar har gjorts.

Öppna sedan implementeringsfilen. Ställ in getter och seters:

...
@synthesize wineViewer;
@synthesize vinnamn;
@ syntetiserar vinodling;
@ syntetiserar viner;
...


I viewDidLoad, som kallas när appen är klar med att initialisera sig själv, lägg till pekare för att hålla initialdata i matrisen så att appen kommer att visa information och bild som finns på index 0.

...
- (void) viewDidLoad
{
MyWineLists * mywines = [[MyWineLists alloc] init];
self.wines = [mywines getMyWines];
[self.wineViewer setImage: ((WineList *) [self.wines objectAtIndex: 0]). photo];
[self.winename setText: ((WineList *) [self.wines objectAtIndex: 0]). wine];

[self.winerating setText: ((WineList *) [self.wines objectAtIndex: 0]). rating];

[super viewDidLoad];
}
...

i viewDidUnload ställer du in dina egenskaper på noll för att frigöra dem från minnet

...
- (void) viewDid Unload
{
[self setWineViewer: nil];
[self setWinename: nil];
[self setWinerating: nil];
[super viewDidUnload];
}
...

Implementera slutligen GetWineListing-metoden, så när användaren klickar på knappen, kommer indexet att ökas och hämtar data vid det valda indexnumret.

...
- (IBAction) GetWineListing: (id) avsändare {
statisk NSI-heltalströmIndex = 0;
if (++ currentIndex == [self.wines count]) {
CURRENT = 0;

}annan{
WineList * aWine = (WineList *) [self.wines objectAtIndex: currentIndex];
[self.winename setText: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine.photo];
}
}
...

Testa din app



Okej, vi är klara. Klicka på Kör-knappen för att starta din app. När appen är klar initialiserad bör du ha från data och bild på skärmen. Klicka på Nästa flaska för att få nästa lista.

Bild 15: Den app som körs

Källkod



Här är den fullständiga källkoden för de olika filerna som skapades.

WineList.m

 // // WineList.m // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import "WineList.h" @implementation WineList @synthesize wineId; @ syntetiserar vin; @ synthesize-betyg; @synthesize photo; // Med ARC, om du valt ID, behöver du inte dealloc @end 

MyWineLists

 // // MyWineLists.h // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import #import @interface MyWineLists: NSObject {sqlite3 * db; } - (NSMutableArray *) getMyWines; @slutet 

WineList.h

 // // WineList.h // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import @interface WineList: NSObject {NSInteger wineId; NSString * vin; NSString * -klassificering; UIImage * foto; } @ fastighet (icke-atomiskt, behålla) NSString * vin; @ egendom (icke-atomisk, tilldela) NSInteger vinId; @ fastighet (icke-atomisk, behålla) NSString * -klassificering; @ fastighet (nonatomic, behåll) UIImage * foto; @slutet 

MyWineLists.m

 // // MyWineLists.m // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import "MyWineLists.h" #import "WineList.h" @implementation MyWineLists - (NSMutableArray *) getMyWines {NSMutableArray * wineArray = [[NSMutableArray alloc] init]; @try {NSFileManager * fileMgr = [NSFileManager defaultManager]; NSString * dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @ "IOSDB.sqlite"]; BOOL framgång = [fileMgr fileExistsAtPath: dbPath]; if (! framgång) {NSLog (@ "Kan inte hitta databasfilen '% @'.", dbPath); } if (! (sqlite3_open ([dbPath UTF8String], & db) == SQLITE_OK)) {NSLog (@ "Ett fel har inträffat."); } const char * sql = "VÄLJ ID, vin, betyg, foto FRÅN WineTbl"; sqlite3_stmt * sqlStatement; if (sqlite3_prepare (db, sql, -1, & sqlStatement, NULL)! = SQLITE_OK) {NSLog (@ "Problem med att förbereda uttalande"); } // while (sqlite3_step (sqlStatement) == SQLITE_ROW) {WineList * MyWine = [[WineList alloc] init]; MyWine.wineId = sqlite3_column_int (sqlStatement, 0); MyWine.wine = [NSString stringWithUTF8String: (char *) sqlite3_column_text (sqlStatement, 1)]; MyWine.rating = [NSString stringWithUTF8String: (char *) sqlite3_column_text (sqlStatement, 2)]; const char * raw = sqlite3_column_blob (sqlStatement, 3); int rawLen = sqlite3_column_bytes (sqlStatement, 3); NSData * data = [NSData dataWithBytes: raw length: rawLen]; MyWine.photo = [[UIImage alloc] initWithData: data]; [wineArray addObject: MyWine]; }} @catch (undantag från NSException *) {NSLog (@ "Ett undantag inträffade:% @", [undantagsskäl]); } @ slutligen {return wineArray; } } @slutet 

kcbViewController

 // // kcbViewController.h // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import @interface kcbViewController: UIViewController {NSMutableArray * viner; } @ egendom (nonatomic, behålla) NSMutableArray * viner; @ fastighet (svag, icke-atomisk) IBOutlet UIImageView * wineViewer; @ fastighet (svag, icke-atomisk) IBOutlet UILabel * winename; @ fastighet (svag, icke-atomisk) IBOutlet UILabel * vinodling; - (IBAction) GetWineListing: (id) avsändare; @slutet 

kcbViewController.m

 // // kcbViewController.m // MyWineList // // Skapad av Kevin Languedoc 11/25/11. // Copyright (c) kCodebook 2011. Alla rättigheter förbehållna. // #import "kcbViewController.h" #import "WineList.h" #import "MyWineLists.h" @implementation kcbViewController @synthesize wineViewer; @synthesize vinnamn; @ syntetiserar vinodling; @ syntetiserar viner; - (void) didReceiveMemoryWarning {[super didReceiveMemoryWarning]; // Släpp cachardata, bilder osv. Som inte används. } #pragma mark - Visa livscykel - (void) viewDidLoad {MyWineLists * mywines = [[MyWineLists alloc] init]; self.wines = [mywines getMyWines]; [self.wineViewer setImage: ((WineList *) [self.wines objectAtIndex: 0]). photo]; [self.winename setText: ((WineList *) [self.wines objectAtIndex: 0]). wine]; [self.winerating setText: ((WineList *) [self.wines objectAtIndex: 0]). rating]; [super viewDidLoad]; } - (void) viewDidUnload {[self setWineViewer: nil]; [self setWinename: nil]; [self setWinerating: nil]; [super viewDidUnload]; } - (IBAction) GetWineListing: (id) avsändare {statisk NSInteger strömIndex = 0; if (++ currentIndex == [self.wines count]) {currentIndex = 0; } annat {WineList * aWine = (WineList *) [self.wines objectAtIndex: currentIndex]; [self.winename setText: aWine.wine]; [self.winerating setText: aWine.rating]; [self.wineViewer setImage: aWine.photo]; }} - (void) viewWillAppear: (BOOL) animerad {[super viewWillAppear: animated]; } - (void) viewDidAppear: (BOOL) animerad {[super viewDidAppear: animated]; } - (void) viewWillDisappear: (BOOL) animerad {[super viewWillDisappear: animated]; } - (void) viewDidDisappear: (BOOL) animerad {[super viewDidDisappear: animated]; } - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {// Return YES for stöder orientering return (interfaceOrientation! = UIInterfaceOrientationPortraitUpsideDown); } @slutet 
Bygg iOS-databasappar med Swift och SQLite Bygg iOS-databasappar med Swift och SQLite

Om du vill ha mer information om hur du utvecklar iOS-databasappar, kolla in min nya bok "Bygg databasappar med Swift och SQLite som publiceras av Apress

Köp nu