Proyectos de Subversion Iphone Microlearning

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  Database.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 2/21/22.
6
//
7
 
8
import Foundation
9
import SQLite3
10
 
11
class Database {
12
 
13
    private var db : OpaquePointer?
14
    private var path : String = Constants.DATABASE_NAME
15
 
16
    public func createTables()
17
    {
18
        self.db = open()
19
        if(self.db != nil) {
20
            self.createTableSync()
21
            self.createTableProgress()
22
            self.createTableUserLog()
23
            self.createTableCompany()
24
            self.createTableTopic()
25
            self.createTableCapsule()
26
            self.createTableSlide()
27
            self.createTableQuiz()
28
            self.createTableQuestion()
29
            self.createTableAnswer()
30
            self.createTableUserExtended()
31
        }
32
    }
33
 
34
    func open() -> OpaquePointer? {
35
 
36
        if db == nil {
37
 
38
            let filePath = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
39
                .appendingPathComponent(path)
40
            var db: OpaquePointer? = nil
41
 
42
            print("Database FilePath : \(filePath.path)")
43
 
44
            if sqlite3_open(filePath.path, &db) != SQLITE_OK {
45
                print("No se pudo abrir la DB : \(path) ")
46
                return nil
47
            } else {
48
                return db
49
            }
50
        } else {
51
            return db
52
        }
53
 
54
    }
55
 
56
    func deleteTables() {
57
        let queries = [
58
            "DELETE FROM " + Constants.TABLE_PROGRESS + ";",
59
            "DELETE FROM " + Constants.TABLE_USER_LOG + ";"
60
        ]
61
 
62
        queries.forEach { query in
63
            var statement : OpaquePointer? = nil
64
 
65
            if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
66
                if sqlite3_step(statement) != SQLITE_DONE {
67
                    print("Fallo la consulta: \(query) ")
68
                }
69
            } else {
70
                print("Fallo la preparación: \(query) ")
71
 
72
            }
73
 
74
        }
75
    }
76
 
77
    private func createTableUserExtended()
78
    {
79
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_USER_EXTENDED + "("
80
        sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_UUID + " TEXT UNIQUE, "
81
        sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_COMPANY_UUID + " TEXT,"
82
        sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_LABEL + " TEXT,"
83
        sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_VALUE + " TEXT"
84
        sql = sql + ");"
85
        let sql1 = "CREATE INDEX `idx_user_extended_company_uuid` ON `" +  Constants.TABLE_USER_EXTENDED + "` (`" +  Constants.TABLE_USER_EXTENDED_FIELD_COMPANY_UUID + "` );"
86
 
87
        var statement : OpaquePointer? = nil
88
 
89
        if sqlite3_prepare_v2(self.db, sql, -1, &statement, nil) == SQLITE_OK {
90
            if sqlite3_step(statement) != SQLITE_DONE {
91
                print("No se pudo crear la tabla: \(Constants.TABLE_USER_EXTENDED)")
92
            }
93
        } else {
94
            print("Fallo la preparación para crear la tabla: \(Constants.TABLE_USER_EXTENDED)")
95
 
96
        }
97
    }
98
 
99
    private func createTableSync()  {
100
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_SYNC + "("
101
        sql = sql + Constants.TABLE_SYNC_FIELD_ID +  " INTEGER PRIMARY KEY, "
102
        sql = sql + Constants.TABLE_SYNC_FIELD_TYPE + " INTEGER,"
103
        sql = sql + Constants.TABLE_SYNC_FIELD_DATA + " TEXT"
104
        sql = sql + ");"
105
 
106
        var statement : OpaquePointer? = nil
107
 
108
        if sqlite3_prepare_v2(self.db, sql, -1, &statement, nil) == SQLITE_OK {
109
            if sqlite3_step(statement) != SQLITE_DONE {
110
                print("No se pudo crear la tabla: \(Constants.TABLE_SYNC)")
111
            }
112
        } else {
113
            print("Fallo la preparación para crear la tabla: \(Constants.TABLE_SYNC)")
114
 
115
        }
116
    }
117
 
118
    private func createTableCompany()  {
119
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_COMPANY + "("
120
        sql = sql + Constants.TABLE_COMPANY_FIELD_UUID + " TEXT UNIQUE, "
121
        sql = sql + Constants.TABLE_COMPANY_FIELD_NAME + " TEXT, "
122
        sql = sql + Constants.TABLE_COMPANY_FIELD_IMAGE + " TEXT "
123
        sql = sql + ");"
124
        var statement : OpaquePointer? = nil
125
 
126
        if sqlite3_prepare_v2(self.db, sql, -1, &statement, nil) == SQLITE_OK {
127
            if sqlite3_step(statement) != SQLITE_DONE {
128
                print("No se pudo crear la tabla: \(Constants.TABLE_COMPANY)");
129
 
130
            }
131
        } else {
132
            print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_COMPANY)")
133
 
134
        }
135
    }
136
 
137
    private func createTableTopic()  {
138
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_TOPIC + "("
139
        sql = sql + Constants.TABLE_TOPIC_FIELD_UUID + " TEXT UNIQUE, "
140
        sql = sql + Constants.TABLE_TOPIC_FIELD_COMPANY_UUID + " TEXT,"
141
        sql = sql + Constants.TABLE_TOPIC_FIELD_NAME + " TEXT,"
142
        sql = sql + Constants.TABLE_TOPIC_FIELD_DESCRIPTION + " TEXT,"
143
        sql = sql + Constants.TABLE_TOPIC_FIELD_IMAGE + " TEXT,"
144
        sql = sql + Constants.TABLE_TOPIC_FIELD_POSITION + " INTEGER "
145
        sql = sql + ");"
146
        let sql1 = "CREATE INDEX `idx_topics_company_uuid` ON `" +  Constants.TABLE_TOPIC + "` (`" +  Constants.TABLE_TOPIC_FIELD_COMPANY_UUID + "` );"
147
        let query = sql + sql1
148
        var statement : OpaquePointer? = nil
149
 
150
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
151
            if sqlite3_step(statement) != SQLITE_DONE {
152
                print("No se pudo crear la tabla: \(Constants.TABLE_TOPIC)")
153
           }
154
        } else {
155
            print("Fallo la preparación para crear la tabla: \(Constants.TABLE_TOPIC)")
156
        }
157
    }
158
 
159
 
160
    private func createTableCapsule()  {
161
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_CAPSULE + "("
162
        sql = sql + Constants.TABLE_CAPSULE_FIELD_UUID + " TEXT UNIQUE, "
163
        sql = sql + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " TEXT,"
164
        sql = sql + Constants.TABLE_CAPSULE_FIELD_NAME + " TEXT,"
165
        sql = sql + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " TEXT,"
166
        sql = sql + Constants.TABLE_CAPSULE_FIELD_IMAGE + " TEXT,"
167
        sql = sql + Constants.TABLE_CAPSULE_FIELD_POSITION + " INTEGER "
168
        sql = sql + ");"
169
        let sql1 = "CREATE INDEX `idx_capsules_topic_uuid` ON `" +  Constants.TABLE_CAPSULE + "` (`" +  Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + "` );"
170
        let query = sql + sql1
171
        var statement : OpaquePointer? = nil
172
 
173
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
174
            if sqlite3_step(statement) != SQLITE_DONE {
175
                print("No se pudo crear la tabla: \(Constants.TABLE_CAPSULE)")
176
           }
177
        } else {
178
            print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_CAPSULE)")
179
        }
180
    }
181
 
182
    private func createTableSlide()  {
183
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_SLIDE + "("
184
        sql = sql + Constants.TABLE_SLIDE_FIELD_UUID + " TEXT UNIQUE, "
185
        sql = sql + Constants.TABLE_SLIDE_FIELD_TOPIC_UUID + " TEXT,"
186
        sql = sql + Constants.TABLE_SLIDE_FIELD_CAPSULE_UUID + " TEXT,"
187
        sql = sql + Constants.TABLE_SLIDE_FIELD_QUIZ_UUID + " TEXT,"
188
        sql = sql + Constants.TABLE_SLIDE_FIELD_NAME + " TEXT,"
189
        sql = sql + Constants.TABLE_SLIDE_FIELD_DESCRIPTION + " TEXT,"
190
        sql = sql + Constants.TABLE_SLIDE_FIELD_TYPE + " TEXT,"
191
        sql = sql + Constants.TABLE_SLIDE_FIELD_FILE + " TEXT,"
192
        sql = sql + Constants.TABLE_SLIDE_FIELD_BACKGROUND + " TEXT,"
193
        sql = sql + Constants.TABLE_SLIDE_FIELD_POSITION + " INTEGER );"
194
 
195
        let sql1 = "CREATE INDEX `idx_slides_quiz_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_QUIZ_UUID + "` );"
196
        let sql2 = "CREATE INDEX `idx_slides_capsule_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_CAPSULE_UUID + "` );"
197
        let sql3 = "CREATE INDEX `idx_slides_topic_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_TOPIC_UUID + "` );"
198
        let query = sql + sql1 + sql2 + sql3
199
        var statement : OpaquePointer? = nil
200
 
201
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
202
            if sqlite3_step(statement) != SQLITE_DONE {
203
                print("No se pudo crear la tabla: \(Constants.TABLE_SLIDE)")
204
           }
205
        } else {
206
            print("Fallo la preparación para crear la tabla: \(Constants.TABLE_SLIDE)")
207
        }
208
    }
209
 
210
 
211
    private func createTableProgress()  {
212
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_PROGRESS + "("
213
        sql = sql + Constants.TABLE_PROGRESS_FIELD_ID + " INTEGER PRIMARY KEY, "
214
        sql = sql + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " TEXT,"
215
        sql = sql + Constants.TABLE_PROGRESS_FIELD_COMPANY_UUID + " TEXT,"
216
        sql = sql + Constants.TABLE_PROGRESS_FIELD_TOPIC_UUID + " TEXT,"
217
        sql = sql + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID + " TEXT,"
218
        sql = sql + Constants.TABLE_PROGRESS_FIELD_SLIDE_UUID + " TEXT,"
219
        sql = sql + Constants.TABLE_PROGRESS_FIELD_PROGRESS + " REAL,"
220
        sql = sql + Constants.TABLE_PROGRESS_FIELD_TOTAL_SLIDES + " INTEGER,"
221
        sql = sql + Constants.TABLE_PROGRESS_FIELD_VIEW_SLIDES + " INTEGER,"
222
        sql = sql + Constants.TABLE_PROGRESS_FIELD_TYPE + " TEXT,"
223
        sql = sql + Constants.TABLE_PROGRESS_FIELD_RETURNING  + " INTEGER,"
224
        sql = sql + Constants.TABLE_PROGRESS_FIELD_RETURNING_AFTER_COMPLETED  + " INTEGER,"
225
        sql = sql + Constants.TABLE_PROGRESS_FIELD_COMPLETED  + " INTEGER,"
226
        sql = sql + Constants.TABLE_PROGRESS_FIELD_ADDED_ON  + " TEXT,"
227
        sql = sql + Constants.TABLE_PROGRESS_FIELD_UPDATED_ON  + " TEXT);"
228
        let sql1 = "CREATE INDEX `idx_progress_topic_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_TOPIC_UUID + "` );"
229
        let sql2 = "CREATE INDEX `idx_progress_capsule_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID + "` );"
230
        let sql3 = "CREATE INDEX `idx_progress_slide_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_SLIDE_UUID + "` );"
231
        let sql4 = "CREATE INDEX `idx_progress_user_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_USER_UUID + "` );"
232
        let query = sql + sql1 + sql2 + sql3 + sql4
233
        var statement : OpaquePointer? = nil
234
 
235
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
236
            if sqlite3_step(statement) != SQLITE_DONE {
237
                print("No se pudo crear la tabla: \(Constants.TABLE_PROGRESS)")
238
           }
239
        } else {
240
            print("Fallo la preparación para la creación de la tabla: \(Constants.TABLE_PROGRESS)")
241
        }
242
    }
243
 
244
    private func createTableUserLog()  {
245
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_USER_LOG + "("
246
        sql = sql + Constants.TABLE_USER_LOG_FIELD_ID + " IINTEGER PRIMARY KEY, "
247
        sql = sql + Constants.TABLE_USER_LOG_FIELD_COMPANY_UUID + " TEXT,"
248
        sql = sql + Constants.TABLE_USER_LOG_FIELD_TOPIC_UUID + " TEXT,"
249
        sql = sql + Constants.TABLE_USER_LOG_FIELD_CAPSULE_UUID + " TEXT,"
250
        sql = sql + Constants.TABLE_USER_LOG_FIELD_SLIDE_UUID + " TEXT,"
251
        sql = sql + Constants.TABLE_USER_LOG_FIELD_USER_UUID + " TEXT,"
252
        sql = sql + Constants.TABLE_USER_LOG_FIELD_ACTIVITY + " TEXT,"
253
        sql = sql + Constants.TABLE_USER_LOG_FIELD_ADDED_ON + " TEXT"
254
        sql = sql + ");"
255
 
256
        let sql1 = "CREATE INDEX `idx_user_log_added_on` ON `" +  Constants.TABLE_USER_LOG + "` (`" +  Constants.TABLE_USER_LOG_FIELD_ADDED_ON + "` );"
257
        let query = sql + sql1
258
        var statement : OpaquePointer? = nil
259
 
260
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
261
            if sqlite3_step(statement) != SQLITE_DONE {
262
                print("No se pudo crear la tabla: \(Constants.TABLE_USER_LOG)")
263
           }
264
        } else {
265
            print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_USER_LOG)")
266
        }
267
    }
268
 
269
 
270
 
271
    private func createTableQuiz()  {
272
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_QUIZ + "("
273
        sql = sql + Constants.TABLE_QUIZ_FIELD_UUID + " INTEGER UNIQUE, "
274
        sql = sql + Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + " INTEGER,"
275
        sql = sql + Constants.TABLE_QUIZ_FIELD_NAME + " text,"
276
        sql = sql + Constants.TABLE_QUIZ_FIELD_TEXT + " text,"
277
        sql = sql + Constants.TABLE_QUIZ_FIELD_FAILED + " text,"
278
        sql = sql + Constants.TABLE_QUIZ_FIELD_POINTS + " INTEGER,"
279
        sql = sql + Constants.TABLE_QUIZ_FIELD_MINIMUM_POINTS_REQUIRED + " INTEGER, "
280
        sql = sql + Constants.TABLE_QUIZ_FIELD_MAX_TIME + " INTEGER);"
281
 
282
        let sql1 = "CREATE INDEX `idx_quizzes_company_uuid` ON `" +  Constants.TABLE_QUIZ + "` (`" +  Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + "` );"
283
        let query = sql + sql1
284
 
285
        var statement : OpaquePointer? = nil
286
 
287
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
288
            if sqlite3_step(statement) != SQLITE_DONE {
289
                print("No se pudo crear la tabla: \(Constants.TABLE_QUIZ)")
290
           }
291
        } else {
292
            print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_QUIZ)")
293
        }
294
 
295
    }
296
 
297
    private func createTableQuestion()  {
298
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_QUESTION + "("
299
        sql = sql + Constants.TABLE_QUESTION_FIELD_UUID + " TEXT UNIQUE, "
300
        sql = sql + Constants.TABLE_QUESTION_FIELD_QUIZ_UUID + " TEXT,"
301
        sql = sql + Constants.TABLE_QUESTION_FIELD_TEXT + " TEXT,"
302
        sql = sql + Constants.TABLE_QUESTION_FIELD_TYPE + " TEXT,"
303
        sql = sql + Constants.TABLE_QUESTION_FIELD_POINTS + " INTEGER,"
304
        sql = sql + Constants.TABLE_QUESTION_FIELD_POSITION + " INTEGER );"
305
 
306
        let sql1 = "CREATE INDEX `idx_questions_quiz_uuid` ON " +  Constants.TABLE_QUIZ + "` (`" +  Constants.TABLE_QUIZ_FIELD_UUID + "` );"
307
        let query = sql + sql1
308
 
309
        var statement : OpaquePointer? = nil
310
 
311
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
312
            if sqlite3_step(statement) != SQLITE_DONE {
313
                print("No se pudo crear la tabla: \(Constants.TABLE_QUESTION)")
314
           }
315
        } else {
316
            print("Fallo la preparación de la creación  de la tabla: \(Constants.TABLE_QUESTION)")
317
        }
318
    }
319
 
320
    private func createTableAnswer()  {
321
        var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_ANSWER + "("
322
        sql = sql + Constants.TABLE_ANSWER_FIELD_UUID + " TEXT UNIQUE, "
323
        sql = sql + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + " TEXT,"
324
        sql = sql + Constants.TABLE_ANSWER_FIELD_TEXT + " TEXT,"
325
        sql = sql + Constants.TABLE_ANSWER_FIELD_POINTS + " INTEGER,"
326
        sql = sql + Constants.TABLE_ANSWER_FIELD_CORRECT + " TEXT); "
327
 
328
        let sql1 = "CREATE INDEX `idx_answers_question_uuid` ON `" +  Constants.TABLE_QUESTION + "` (`" +  Constants.TABLE_QUESTION_FIELD_UUID + "` );"
329
        let query = sql + sql1
330
        var statement : OpaquePointer? = nil
331
 
332
        if sqlite3_prepare_v2(self.db, query, -1, &statement, nil) == SQLITE_OK {
333
            if sqlite3_step(statement) != SQLITE_DONE {
334
                print("No se pudo crear la tabla: \(Constants.TABLE_ANSWER)")
335
           }
336
        } else {
337
            print("Fallo la preparación para la creación de la tabla: \(Constants.TABLE_ANSWER)")
338
        }
339
    }
340
 
341
 
342
 
343
 
344
}