Wednesday, September 14, 2011

Re: [android-developers] Re: XML files and SQLITE Database

Hi Bishan

I hope is helpful

private var sqlc:SQLConnection = new SQLConnection();
// sqlc is an SQLStatment which we need to execute our sql commands
private var sqls:SQLStatement = new SQLStatement();
// ArrayCollection used as a data provider for the datagrid. It has to be bindable so that data in datagrid changes automatically when we change the ArrayCollection
private var dp:ArrayCollection = new ArrayCollection();

private function start():void
{
var folder:File = File.applicationDirectory;
var db:File = folder.resolvePath("test.bd");
// first we need to set the file class for our database (in this example test.db). If the Database doesn't exists it will be created when we open it.
//var db:File = File.applicationStorageDirectory.resolvePath("test.db");
// after we set the file for our database we need to open it with our SQLConnection.
sqlc.openAsync(db);
// we need to set some event listeners so we know if we get an sql error, when the database is fully opened and to know when we recive a resault from an sql statment. The last one is uset to read data out of database.
sqlc.addEventListener(SQLEvent.OPEN, db_opened);
sqlc.addEventListener(SQLErrorEvent.ERROR, error);
sqls.addEventListener(SQLErrorEvent.ERROR, error);
sqls.addEventListener(SQLEvent.RESULT, resault);
}

private function db_opened(e:SQLEvent):void
{
// when the database is opened we need to link the SQLStatment to our SQLConnection, so that sql statments for the right database.
// if you don't set this connection you will get an error when you execute sql statment.
sqls.sqlConnection = sqlc;
// in property text of our SQLStatment we write our sql command. We can also combine sql statments in our text property so that more than one statment can be executed at a time.
// in this sql statment we create table in our database with name "test_table" with three columns (id, first_name and last_name). Id is an integer that is auto incremented when each item is added. First_name and last_name are columns in which we can store text
// If you want to know more about sql statments search the web.
sqls.text = "CREATE TABLE IF NOT EXISTS test_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name TEXT, last_name TEXT);";
// after we have connected sql statment to our sql connection and writen our sql commands we also need to execute our sql statment.
// nothing will change in database until we execute sql statment.
sqls.execute();
// after we load the database and create the table if it doesn't already exists, we call refresh method which i have created to populate our datagrid
refresh();
}

private function addItem():void
{
// in this sql statment we add item at the end of our table with values first_name.text in column first_name and last_name.text for column last_name
sqls.text = "INSERT INTO test_table (first_name, last_name) VALUES('"+first_name.text+"','"+last_name.text+"');";
sqls.execute();
refresh();
}

private function refresh(e:TimerEvent = null):void
{
// timer object which we need if sql statment is still executing so that we can try again after 10 milliseconds.
var timer:Timer = new Timer(10,1);
timer.addEventListener(TimerEvent.TIMER, refresh);
if ( !sqls.executing )// we need to check if our sql statment is still executing our last sql command. If so we use Timer to try again in 10 milliseconds. If we wouldn't check we could get an error because SQLStatment can't execute two statments at the same time.
{
// sql statment which returns all the data from our "test_table". To retrive only data from first_name and last_name columns we would use "SELECT first_name,last_name FROM test_table"
sqls.text = "SELECT * FROM test_table"
sqls.execute();
}
else
{
timer.start();
}
}

private function resault(e:SQLEvent):void
{
// with sqls.getResault().data we get the array of objects for each row out of our database
var data:Array = sqls.getResult().data;
// we pass the array of objects to our data provider to fill the datagrid
dp = new ArrayCollection(data);
}

// method to remove row from database.
private function remove():void
{
// sql statment to delete from our test_table the row that has the same number in number column as our selected row from datagrid
sqls.text = "DELETE FROM test_table WHERE id="+dp[dg.selectedIndex].id;
sqls.execute();
refresh();
}

2011/9/14 lbendlin <lutz@bendlin.us>
you seem to have a fundamental problem here. SQLite is a RELATIONAL database. XML is HIERARCHICAL. The Mericans would say "trying to push a square peg in a round hole"
 
Before you can insert the XML data into SQLite you either need to flatten the data, or indicate a parent/child relationship between entries, or simply store the whole XML as a string.

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment