From b5a5ba2961597e6dc65e24b57119ed0629c28852 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Wed, 6 Dec 2017 13:23:31 +0000 Subject: [PATCH 1/3] Fixing docs Some syntax changes (highlighting/capatilisation), code fixes and additional info added --- README.md | 80 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index f3afc5e..5e321a3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # Adding a Database to FoodTracker Server with Swift-Kuery

+ Kitura Bird +

@@ -10,11 +12,11 @@

-This tutorial builds upon a server and application created by following the [FoodTrackerBackend](https://github.com/IBM/FoodTrackerBackend) tutorial. These instructions demonstrate how to add a PostgreSQL database to the FoodTracker server using [Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) and [Swift-Kuery-PostgreSQL](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL) so data persists between server restarts. +This tutorial builds upon the server and application created by following the [FoodTrackerBackend](https://github.com/IBM/FoodTrackerBackend) tutorial. These instructions demonstrate how to add a PostgreSQL database to the FoodTracker server using [Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) and [Swift-Kuery-PostgreSQL](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL) so data persists between server restarts. ## Pre-Requisites: -This tutorial follows on from the FoodTracker Application and server created by following the [FoodTrackerBackend](https://github.com/IBM/FoodTrackerBackend) tutorial. If you have completed the FoodTracker Backend there are no further pre-requisites. +This tutorial follows on from the FoodTracker application and server created by following the [FoodTrackerBackend](https://github.com/IBM/FoodTrackerBackend) tutorial. If you have completed FoodTrackerBackend there are no further pre-requisites. If you have not completed the [FoodTrackerBackend](https://github.com/IBM/FoodTrackerBackend) tutorial follow the steps below to get started: @@ -24,11 +26,11 @@ If you have not completed the [FoodTrackerBackend](https://github.com/IBM/FoodTr `sudo gem install cocoapods` -3. Open a terminal window and clone the FoodTracker application and Server: +3. Open a terminal window and clone the FoodTracker application and server: `git clone https://github.com/Andrew-Lees11/SwiftPersistanceTutorial.git` -4. Switch to the "completedFoodBackend" branch: +4. Switch to the "completedFoodBackend" branch to pull in the backend code: ``` cd SwiftPersistanceTutorial git checkout completedFoodBackend @@ -42,18 +44,18 @@ pod install ``` open FoodTracker.xcworkspace/ ``` -This Xcode workspace contains the food tracker mobile app, which can be run by clicking the play button. +This Xcode workspace contains the FoodTracker mobile app, which can be run by clicking the play button. ## Connecting A PostgreSQL Database ### Creating a PostgreSQL Database -The Food Tracker application is taken from the Apple tutorial for building your first iOS application. In [FoodTrackerBackend Tutorial](https://github.com/IBM/FoodTrackerBackend), we created a server and connected it to the iOS application. This means created meals are posted to the server and a user can then view these meals on [localhost:8080/meals](http://localhost:8080/meals). Since the meals are stored on the Server, if the server is restarted the meal data is lost. To solve this problem, we will start by creating a PostgreSQL database where the meals will be stored. +The Food Tracker application is taken from the Apple tutorial for building your first iOS application. In [FoodTrackerBackend Tutorial](https://github.com/IBM/FoodTrackerBackend), we created a server and connected it to the iOS application. This server allows created meals to be posted to the server and viewed by the user at [localhost:8080/meals](http://localhost:8080/meals). As the meals are stored on the server, the meal data is lost if the server is restarted. To solve this problem, we will start by creating a PostgreSQL database for the meals to be stored in. 1. Install PostgreSQL: ``` brew install postgresql brew services start postgresql ``` -You should receive a message that either PostgreSQL has been started or the service is already running. This installation should have installed two applications we need, namely createdb and psql, which will be used as clients to your locally running PostgreSQL. +You should see a message that `postgresql` has been started or the service is already running. This installation will also have installed `createdb` and `psql` which will be used as clients to your locally running PostgreSQL database. 2. Create a database called FoodDatabase to store the data: ``` @@ -63,7 +65,7 @@ createdb FoodDatabase ``` psql FoodDatabase ``` -4. Create a table to contain your meals: +4. Create a table to contain your meals, by pasting this into the command line you initiated in the previous step: ``` CREATE TABLE meals ( name varchar(100) PRIMARY KEY, @@ -71,7 +73,7 @@ CREATE TABLE meals ( rating integer ); ``` -**Note** Name has been designated the primary key, therefore every name must be unique. +**Note** Name has been designated the primary key, therefore every meal name must be unique. 5. View your table to ensure it has been created: ``` @@ -79,50 +81,51 @@ TABLE meals; ``` At this point it will be empty since we have not inserted anything. -6. Type `\q` and then press ENTER to quit psql. +6. Type `\q` and then press ENTER to quit `psql`. ### Adding Swift-Kuery dependencies to your server [Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) is a database abstraction layer, it works alongside a specific database library, such as [Swift-Kuery-PostgreSQL](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL), to allow a user to easily query a SQL database in Swift. These two libraries are added to our Package.swift file, so the Server can access them. 1. Open a new terminal window and go into your server `Package.swift` file ``` -cd SwiftPersistanceTutorial/FoodTrackerBackend/FoodServer +cd SwiftPersistenceTutorial/FoodTrackerBackend/FoodServer/ open Package.swift ``` -2. Add Swift-Kuery and Swift-Kuery-PostgreSQL packages. +2. Add the following two lines to the dependencies in your `Package.swift` file to add Swift-Kuery and Swift-Kuery-PostgreSQL to the app. ```swift .package(url: "https://github.com/IBM-Swift/Swift-Kuery.git", .upToNextMinor(from: "1.0.0")), .package(url: "https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL.git", .upToNextMinor(from: "1.0.1")), ``` -3. Change targets to include Swift-Kuery and Swift-Kuery-PostgreSQL. +3. Change the targets in your `Package.swift` file to include Swift-Kuery and Swift-Kuery-PostgreSQL, as below. ```swift .target(name: "FoodServer", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger", "SwiftKuery", "SwiftKueryPostgreSQL"]), .target(name: "Application", dependencies: [ "Kitura", "Configuration", "CloudEnvironment","SwiftMetrics","Health", "SwiftKuery", "SwiftKueryPostgreSQL"]), ``` ### Generate your FoodServer Xcode project -Now we have added the dependencies to our `Package.swift` file we can generate our FoodServer Xcode project to make editing the code easier. The FoodServer is a pure Swift project and so the following steps could also be achieved by editing the .swift files. +Now we have added the dependencies to our `Package.swift` file, we can generate our FoodServer Xcode project to make editing the code easier. FoodServer is a pure Swift project and so the following steps could also be achieved by editing the .swift files. -1. Generate the server Xcode project: +1. Generate the FoodServer Xcode project: ``` -cd SwiftPersistenceTutorial/FoodTrackerBackend//FoodServer/ +cd SwiftPersistenceTutorial/FoodTrackerBackend/FoodServer/ swift package generate-xcodeproj open FoodServer.xcodeproj/ ``` -2. Click on the "FoodServer-Package" text on the top-left of the toolbar and select "Edit scheme" from the dropdown menu. -3. In "Run" click on the "Executable" dropdown, select FoodServer and click Close. +2. Click on the "FoodServer-Package" text on the top-left of the toolbar and select "Edit Scheme" at the bottom of the dropdown menu. +3. In "Run", change the "Executable" dropdown to FoodServer, your scheme should look like the image below. Once you're happy click "Close". +![Scheme change screenshot](SchemeChangeScreenshot.png) Now when you press play, Xcode will start your FoodTracker server listening on port 8080. You can see this by going to [http://localhost:8080/](http://localhost:8080/ ) which will show the default Kitura landing page. ### Create a Meals Table class -To work with the meals table in the database Swift-Kuery requires a matching class. We will now create a `Meals` class to match the meals table we created earlier in PostgreSQL. +To work with the meals table in the database, Swift-Kuery requires a matching class. We will now create a `Meals` class to match the meals table we created earlier in PostgreSQL. -1. Open your `Sources > Application > Meal.swift` file +1. In Xocde, open your `Sources > Application > Meal.swift` file. 2. Add SwiftKuery and SwiftKueryPostgreSQL to the import statements: ```swift import SwiftKuery import SwiftKueryPostgreSQL ``` -3. Create a class, which matches the meals table you created in the database: +3. Under these import statements, create a class which matches the Meals table you created in the database: ```swift public class Meals : Table { let tableName = "meals" @@ -137,7 +140,7 @@ public class Meals : Table { import SwiftKuery import SwiftKueryPostgreSQL ``` -6. Inside the `App` class create a `Meals` table object by inserting the line: +6. Inside the `App` class create an instance of the `Meals` table object by inserting the following line: ```swift let meals = Meals() ``` @@ -166,7 +169,7 @@ connection.connect() { error in ## Querying the PostgreSQL Database -Once you have connected to your database, the code to perform queries is handled by the Swift-Kuery library. This means the following code would be the same for any supported SQL database. +Once you have connected to your database, the code to perform queries is handled by the Swift-Kuery library. This means the following code could be used for any supported SQL database. ### Handling an HTTP POST request We are now going to add an insert query to our `storeHandler`. This will mean that when our server receives an HTTP `POST` request, it will take the received data and perform an SQL `INSERT` query to the database. This will store the data in the Meals table in the database. @@ -176,7 +179,7 @@ We are now going to add an insert query to our `storeHandler`. This will mean th // Build and execute your query here. let insertQuery = Insert(into: self.meals, values: [meal.name, String(describing: meal.photo), meal.rating]) ``` -2. Add the following code to execute the insert query below your declaration of `insertQuery` +2. Add the following code to execute the insert query below your declaration of `insertQuery`. ```swift connection.execute(query: insertQuery) { result in // Respond to the result here @@ -188,7 +191,12 @@ connection.execute(query: insertQuery) { result in ```swift completion(meal, nil) ``` -4. Your completed `storeHandler` function should now look as follows: +4. Remove the following two lines at the end of the original `storeHandler` function. These were used when the meal was being stored on the server, but we don't need them now we're using a database. +```swift +mealStore[meal.name] = meal +completion(mealStore[meal.name], nil) +``` +Your completed `storeHandler` function should now look as follows: ```swift func storeHandler(meal: Meal, completion: (Meal?, RequestError?) -> Void ) -> Void { connection.connect() { error in @@ -204,34 +212,34 @@ func storeHandler(meal: Meal, completion: (Meal?, RequestError?) -> Void ) -> Vo } } ``` -Now when you create a meal in the application, the server will make an insert call to the PostgreSQL database. +Now when you create a meal in the application, the server will perform an `INSERT` query on the PostgreSQL database. You can verify this by: -1. Starting the FoodTracker application in Xcode. +1. Starting the FoodTracker application in Xcode, making sure your FoodServer application is also still running. 2. Creating a meal in the application. 3. Accessing your database: `psql FoodDatabase` 4. Viewing your meals table: `TABLE meals;` -This should produce a table with the name, encoded photo string and rating of your newly added meal. +This should produce a table with the name, encoded photo string and rating of the meals in the FoodTracker app, including your newly added meal. ### Handling an HTTP GET request -We are going to add a select query to our `loadHandler` function. This will mean that when the server receives an HTTP `GET` request, it will perform an SQL `SELECT` query to get the meals from the database. This means the data the server returns to the client is taken from the database and will persist, even if the server is restarted. +We are going to add a `SELECT` query to our `loadHandler` function so when the server receives an HTTP `GET` request, it will be able to get the meals from the database. Now the data returned to the client will be from the database and will persist, even if the server is restarted. 1. Create a temporary mealstore inside your `loadHander` function. Paste the following code on the first line of the `loadHander` function. ```swift var tempMealStore: [String: Meal] = [:] ``` -2. Inside the `loadHander` function create an select query. +2. Inside the `loadHander` function create a `Select` query. ```swift // Build and execute your query here. -let query = Select(from :meals) +let selectQuery = Select(from :meals) ``` -This query will return everything from the "meals" table. +This query will return everything from the meals table. -3. Add the following code to execute the select query below your declaration of `selectQuery` +3. Add the following code to execute the query below your declaration of `selectQuery`. ```swift connection.execute(query: selectQuery) { queryResult in // Handle your result here @@ -248,7 +256,7 @@ if let resultSet = queryResult.asResultSet { } ``` -5. For each row, create a `Meal` object from the table and add it to your temporary mealstore: +5. For each row in the database, create a `Meal` object from the table and add it to your temporary mealstore: ```swift // Process rows guard let name = row[0], let nameString = name as? String else{return} @@ -258,7 +266,7 @@ guard let rating = row[2], let ratingInt = Int(String(describing: rating)) else{ let currentMeal = Meal(name: nameString, photo: photoData, rating: ratingInt) tempMealStore[nameString] = currentMeal ``` -In this example, we have parsed the cells from each row to be the correct type to create a meal object. +In this example, we have parsed the cells from each row to be the correct type to create the `Meal` object. **Note** For this tutorial we will not be storing the photo data in the database, instead we will store a string description of the photo and then encode that string to data when creating the `Meal` object. 6. At the end of the `loadHandler` function, replace your old mealstore with your newly created `tempMealStore` and return this as your response to the `GET` request. @@ -296,7 +304,7 @@ func loadHandler(completion: ([Meal]?, RequestError?) -> Void ) -> Void { } ``` -Now when you preform a `GET` call to your server it will lookup and return the values from your database. +Now when you preform a `GET` call to your server, it will lookup and return the values from your database. You can verify this by going to [http://localhost:8080/meals](http://localhost:8080/meals), where you should see your meals. You can now restart your server and this data will persist, since it is stored within the database! From 05af48608981c9e5f08287507b72f87b3b896eec Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Wed, 6 Dec 2017 13:28:04 +0000 Subject: [PATCH 2/3] Adding screenshot image --- SchemeChangeScreenshot.png | Bin 0 -> 62603 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SchemeChangeScreenshot.png diff --git a/SchemeChangeScreenshot.png b/SchemeChangeScreenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8220d9130c3ec0528d179d0aa297e0907e59c216 GIT binary patch literal 62603 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%0D#MtVWhFK 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 literal 0 HcmV?d00001 From fdec5ba5a99cb3e43ff9560d2bbb97f7a231be60 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 7 Dec 2017 16:23:34 +0000 Subject: [PATCH 3/3] Requested docs fixes --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5e321a3..abb6fd1 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ git checkout completedFoodBackend cd FoodTrackerBackend/iOS/FoodTracker pod install ``` -6. Open the FoodTracker Application in Xcode +6. Open the FoodTracker application in Xcode ``` open FoodTracker.xcworkspace/ ``` @@ -84,7 +84,7 @@ At this point it will be empty since we have not inserted anything. 6. Type `\q` and then press ENTER to quit `psql`. ### Adding Swift-Kuery dependencies to your server -[Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) is a database abstraction layer, it works alongside a specific database library, such as [Swift-Kuery-PostgreSQL](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL), to allow a user to easily query a SQL database in Swift. These two libraries are added to our Package.swift file, so the Server can access them. +[Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) is a database abstraction layer, it works alongside a specific database library, such as [Swift-Kuery-PostgreSQL](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL), to allow a user to easily query a SQL database in Swift. These two libraries are added to our `Package.swift` file, so the Server can access them. 1. Open a new terminal window and go into your server `Package.swift` file ``` @@ -119,7 +119,7 @@ Now when you press play, Xcode will start your FoodTracker server listening on p ### Create a Meals Table class To work with the meals table in the database, Swift-Kuery requires a matching class. We will now create a `Meals` class to match the meals table we created earlier in PostgreSQL. -1. In Xocde, open your `Sources > Application > Meal.swift` file. +1. In Xcode, open your `Sources > Application > Meal.swift` file. 2. Add SwiftKuery and SwiftKueryPostgreSQL to the import statements: ```swift import SwiftKuery @@ -147,7 +147,7 @@ let meals = Meals() below the line `let cloudEnv = CloudEnv()` ### Connecting to the PostgreSQL database -We will now connect to our server to the PostgreSQL database. This will allow us to send and receive information using queries. +We will now connect our server to the PostgreSQL database. This will allow us to send and receive information using queries. 1. Staying within your `Application.swift` file set up a connection by inserting: ```swift