33. SQLite API -
Opening a connection
Tuesday, September 28, 2010
34. SQLite API -
Opening a connection
#import "sqlite3.h"
Tuesday, September 28, 2010
35. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
Tuesday, September 28, 2010
36. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
Tuesday, September 28, 2010
37. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
Tuesday, September 28, 2010
38. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
[NSException raise:@"SQLITE ERROR"
Tuesday, September 28, 2010
39. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
[NSException raise:@"SQLITE ERROR"
format:@"Error %d", result];
Tuesday, September 28, 2010
40. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
[NSException raise:@"SQLITE ERROR"
format:@"Error %d", result];
}
Tuesday, September 28, 2010
41. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
[NSException raise:@"SQLITE ERROR"
format:@"Error %d", result];
}
//later
Tuesday, September 28, 2010
42. SQLite API -
Opening a connection
#import "sqlite3.h"
sqlite3 *db;
int result = sqlite3_open(PATH, &db);
if (result != SQLITE_OK) {
[NSException raise:@"SQLITE ERROR"
format:@"Error %d", result];
}
//later
sqlite3_close(db);
Tuesday, September 28, 2010
43. SQLite API -
executing queries
Tuesday, September 28, 2010
44. SQLite API -
executing queries
int sqlite3_exec(
Tuesday, September 28, 2010
45. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
Tuesday, September 28, 2010
46. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
Tuesday, September 28, 2010
47. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
Tuesday, September 28, 2010
48. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
Tuesday, September 28, 2010
49. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
Tuesday, September 28, 2010
50. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
Tuesday, September 28, 2010
51. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
//callback signature
Tuesday, September 28, 2010
52. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
//callback signature
int RowCallback(void * context,
Tuesday, September 28, 2010
53. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
//callback signature
int RowCallback(void * context,
int numColumns,
Tuesday, September 28, 2010
54. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
//callback signature
int RowCallback(void * context,
int numColumns,
char** colValues,
Tuesday, September 28, 2010
55. SQLite API -
executing queries
int sqlite3_exec(
sqlite3 *db,
char *sql,
int (*callback)(void *, int, char**, char**) callbackFunc,
void *context,
char **errorMessage
);
//callback signature
int RowCallback(void * context,
int numColumns,
char** colValues,
char ** colNames);
Tuesday, September 28, 2010
56. SQLite API -
Prepared Statements
More Powerful
Unfortunately much more code!
Tuesday, September 28, 2010
116. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
Tuesday, September 28, 2010
117. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
Tuesday, September 28, 2010
118. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
Tuesday, September 28, 2010
119. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
Tuesday, September 28, 2010
120. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
Tuesday, September 28, 2010
121. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
Tuesday, September 28, 2010
122. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
Tuesday, September 28, 2010
123. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
Tuesday, September 28, 2010
124. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
Tuesday, September 28, 2010
125. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
Tuesday, September 28, 2010
126. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
Tuesday, September 28, 2010
127. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
Tuesday, September 28, 2010
128. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"insert into test (a, b) values (?, ?)" ,
Tuesday, September 28, 2010
129. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"insert into test (a, b) values (?, ?)" ,
@"hi'", // look! I put in a ', and I'm not escaping it!
Tuesday, September 28, 2010
130. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"insert into test (a, b) values (?, ?)" ,
@"hi'", // look! I put in a ', and I'm not escaping it!
[NSNumber numberWithInt:i]];
Tuesday, September 28, 2010
131. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"insert into test (a, b) values (?, ?)" ,
@"hi'", // look! I put in a ', and I'm not escaping it!
[NSNumber numberWithInt:i]];
}
Tuesday, September 28, 2010
132. FMDB Usage
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open])
NSLog(@"Could not open db.");
[db executeUpdate:@"blah blah blah"];
if ([db hadError])
NSLog(@"Err %d: %@", [db lastErrorCode],
[db lastErrorMessage]);
[db executeUpdate:@"create table test (a text, b integer)"];
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"insert into test (a, b) values (?, ?)" ,
@"hi'", // look! I put in a ', and I'm not escaping it!
[NSNumber numberWithInt:i]];
}
[db commit];
Tuesday, September 28, 2010
133. What about updates?
Database is never copied over again
If we did, your customers would lose
data
Tuesday, September 28, 2010
134. Migrations
Concept from Ruby on Rails
Evolutionary database design
Each database has a "version"
App runs all migrations to the latest
version
Tuesday, September 28, 2010
135. Migrations
number name
1 initial_schema
2 update_foo
3 implement_blah
Tuesday, September 28, 2010
136. Migrations
number name
1 initial_schema
2 update_foo
3 implement_blah
Tuesday, September 28, 2010