1. ME: SEAN VOISEN
THIS: SYNC IT UP
Synchronizing Desktop Data with AIR and SQLite
@ FITC, Toronto on April 21, 2008
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
2. A FEW ASSUMPTIONS ...
•YOU KNOW SOME AS3
•YOU’VE TRIED AIR DEVELOPMENT
•YOU KNOW A LITTLE SQL
3. 1. WHY SYNCHRONIZE?
2. SYNCHRONIZATION STRATEGIES.
3. DESIGN PATTERNS.
4. SQLITE IN AIR.
5. CONNECTION DETECTION IN AIR.
6. AS3 PROGRAMMING STRATEGIES.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
4. WHY SYNCHRONIZE?
When it’s not always good to have your head in the
“cloud.”
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
5. •OFFLINE DATA ACCESS
•LARGE DATA SETS
•FASTER START UP TIME
•STORE EPHEMERAL DATA
•EXPORT DATA EASILY
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
6. SYNCHRONIZATION
STRATEGIES.
Keeping your data fresh.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
7. •USER MAKES CHANGES WHILE OFFLINE
•DATA IS CHANGED ON SERVER BY THIRD
PARTIES
•DATA IS CHANGED LOCALLY BY THIRD
PARTIES (RSS FEEDS)
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
8. MANUAL SYNC
•REQUIRES USER TO PUSH A BUTTON
•GOOD FOR SHORT SYNC TIMES OR
SMALL AMOUNTS OF DATA
•EASIEST TO IMPLEMENT
•BUT ... USER MAY FORGET
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
9. BACKGROUND SYNC
•WORKS “BEHIND THE SCENES”
WITHOUT INTERVENTION
•USE TIMER OR TRIGGERING EVENTS
(PROBABLY BOTH)
•SERVER CAN PUSH DATA (LIVECYCLE
DATA SERVICES)
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
10. WHAT TO SYNC
•TIMESTAMPS
•“DIRTY” BITS
•DIRECT DATA COMPARISON
•COLLISIONS: CLIENT OVERRIDES
SERVER, SERVER OVERRIDES CLIENT
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
11. DESIGN PATTERNS
Make it beautiful and usable.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
12. •PATTERN: AN APPROPRIATE AND
SUCCESSFUL APPROACH TO A
PROBLEM.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
14. •ACCOMODATES BOTH MANUAL
AND BACKGROUND
SYNCHRONIZATION
•UNOBTRUSIVE
•CONNECTION AVAILABILITY
AND SYNC ARE VISUALLY LINKED
15. DEMO: PAYPAL DESKTOP.
A combined project of Adobe XD and PayPal, with a
little help from yours truly.
16. SQLite in AIR.
What you need to know to
get your feet wet.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
17. •EMBEDDED SQL DATABASE ENGINE
•NO SETUP, NO SERVER
•DATABASE IS STORED AS A SINGLE FILE
•MOST OF SQL92 SUPPORTED
• INCLUDING THE ADVANCED STUFF LIKE
VIEWS, TRANSACTIONS AND TRIGGERS!
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
18. DATA TYPES in SQLite
•SQLite USES TYPE AFFINITIES
•TYPE “AFFINITY” = RECOMMENDED,
BUT NOT REQUIRED
•THE NORMAL SQLite AFFINITIES:
• NULL, INTEGER, REAL, TEXT, BLOB
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
19. •ADDITIONAL TYPE AFFINITIES
AVAILABLE FOR AIR:
• TEXT, NUMERIC, INTEGER, REAL, BOOLEAN,
DATE, XML, XMLList, OBJECT, NONE
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
20. THE BASICS
1. CREATE A File REFERENCE FOR THE DB
2. CREATE A SQLConnection INSTANCE
3. OPEN SQLConnection ON FILE
4. CREATE A QUERY USING
SQLStatement
5. EXECUTE THE QUERY
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
21. var db:File = File.applicationStorageDirectory.resolvePath(
"filename.db");
var connection:SQLConnection = new SQLConnection();
connection.openAsync(db, SQLMode.CREATE);
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = connection;
stmt.text = "SELECT * FROM mytable";
stmt.addEventListener( SQLEvent.RESULT, onResult );
stmt.execute();
22. •SQLConnection SUPPORTS BOTH
SYNCHRONOUS AND ASYNCHRONOUS
CONNECTIONS
• SYNC: APP INTERACTIVITY BLOCKED UNTIL
COMPLETE (LIKE FILE I/O API)
• ASYNC: USES EVENT LISTENERS AND
QUERIES ARE QUEUED
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
23. ABOUT PARAMETERS
var stmt:SQLStatement = new SQLStatement();
stmt.text = "SELECT * FROM mytable WHERE id = :id";
stmt.parameters[":id"] = 5;
stmt.execute();
•CACHES QUERY FOR FASTER
EXECUTION
•PREVENTS INJECTION VULNERABILITY
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
24. ABOUT RESULT PAGING
•SQLStatement SUPPORTS PAGING
•LIMITS NUMBER OF ROWS RETURNED
var statement:SQLStatement = new SQLStatement();
statement.sqlConnection = mySQLConnection;
statement.text = "SELECT * FROM contacts";
statement.execute( 10 );
statement.next();
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
25. ABOUT TRANSACTIONS
•MULTIPLE STATEMENTS (USING
LOOPS) IN ONE WRITE OPERATION
•ALLOWS ROLLBACKS ON ERROR
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = connection;
stmt.text = "INSERT INTO tasks VALUES(:task)";
connection.begin();
for each( var task:String in tasks ) {
stmt.parameters[":task"] = task;
stmt.execute();
}
connection.commit();
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
26. CONNECTION
DETECTION
in AIR.
Is this thing on?
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
27. •NATIVE NativeApplication.nativeApplication.addEventListener(
Event.NETWORK_CHANGE, onNetworkChange );
• ONLY DETECTS A CHANGE!
•SERVICE MONITOR FRAMEWORK
• URLMonitor
var m:URLMonitor = new URLMonitor(
new URLRequest('http://myurl.com') );
m.addEventListener( StatusEvent.STATUS, onStatus );
m.start();
• SocketMonitor
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
28. AS3 PROGRAMMING
STRATEGIES
A few tips to make your life easier.
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
29. CREATE DAOs
•DAO = DATA ACCESS OBJECT
•SINGLETON or STATIC CLASS
•ABSTRACTS SQL MANIPULATION,
HANDLES CRUD OPERATIONS
•ONE PLACE FOR DB ACCESS and
HANDLING DB ERRORS
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
30. public class ContactsDAO {
private static var instance:ContactsDAO;
public function ContactsDAO() {
if( ContactsDAO.instance != null ) {
throw new Error("Singleton!");
}
}
public static function getInstance():ContactsDAO {
if( ContactsDAO.instance == null ) {
ContactsDAO.instance = new ContactsDAO();
}
return ContactsDAO.instance;
}
public function getAllContacts( resultHandler:Function,
faultHandler:Function ):void {
var statement:SQLStatement = new SQLStatement();
statement.sqlConnection = mySQLConnection;
statement.text = "SELECT * FROM contacts";
statement.execute( -1, new Responder(
function( result:SQLResult ):void {
resultHandler.call( this, result.data );
}, faultHandler )
);
}
}
31. USE “IF NOT EXISTS”
•CREATE TABLES WHEN DB IS OPENED
IF THEY DON’T EXIST
var statement:SQLStatement = new SQLStatement();
statement.sqlConnection = mySQLConnection;
statement.text = "CREATE TABLE IF NOT EXISTS mytable (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"first_name TEXT," +
"last_name TEXT)";
statement.addEventListener( SQLEvent.RESULT, onResult );
statement.execute();
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
32. WATCH FOR MEMORY
LEAKS
•DATA QUERIED FROM SQL STORED IN
Array/ArrayCollection
• DATA CAN’T BE USED DIRECTLY FROM DB IN
GRIDS, CHARTS, ETC.
• RELOAD ALL DATA IN ARRAYS? OR
INDIVIDUAL ITEMS?
•USE FLEX 3 PROFILER
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.
34. USE SQLiteAdmin
•USED TO HANDY TOOLS LIKE
PHPMyAdmin? Try:
http://coenraets.org/blog/2008/02/
sqlite-admin-for-air-10/
Sean Voisen 2008.
Licensed under Creative Commons Attribution No-Derivatives 3.0 license.