Thursday, January 20, 2011

Difference between Propery Bag and Fixed Schema #Rhomobile

Rhomobile provide a mini ORM called Rhom. It is similer to Active Record of Rails but with less features.It provides a high level way to make the local database easier to program. That database is SQLite on all platforms except BlackBerry where it is HSQL.  

We can choose to store data in two way Propery Bag or Fixed Schema

Property Bag
All the data is store in stores in single table. Property bag is a db table which contains object id/attribute/value triplets and therefore set of attributes for each object is arbitrary.

Advantage
  • It is simple to use, no require for specifiyng attributes before use
  • we don't need to migrate data if  we add/remove attributes
Disadvantage
  • Size is 3 times bigger than fixed schema
  • Slow while sync

 This is how model look for PropertyBag:

class Employee
  include Rhom::PropertyBag

  # Uncomment the following line to enable sync with Employee.
  # enable :sync

  #add model specifc code here
end

Fixed Scema
Fixed schema is a regular db table with fixed set of columns (attributes)

Advantage
  •   Smaller size, you can specify index for only required attributes
  •   Faster sync time then Property bag
Disadvantage
  • You have to support all schema changes
 This is how fixed schema model looks :

class Employee
  include Rhom::FixedSchema

  # Uncomment the following line to enable sync with Employee.
  # enable :sync
  set :schema_version, '1.1'
  property :name, :string
  property :age, :string
  property :company, :string
  property :address, :string
  property :gender, :string
  property :salary, :string
  #add model specifc code here
end

Note : You have to reset database if you change the property

When you use Fixed Schema model application developer is responsible for sql schema. So when you add or delete some properties or just change app logic you may need to perform data migration or database reset.
So if you have to add a column in a table we have to add a property and then reset the Device.

To create a index in fixed schema we will write following line in model :
index :by_name_tag, [:name, :tag] #will create index for name and tag columns  

To create a primary key in fixed schema we will write following line in model :
unique_index :by_phone, [:phone]

Choosing in between PropertyBag and FixedSchema depend on you requirement. 

Monday, January 10, 2011

Disable status popup in Rhomobile

If you want to disable popup then add this line before dosync :
SyncEngine.enable_status_popup("disable")

And If you want to show popup then add this line before dosync :
SyncEngine.enable_status_popup("enable")

By default  :
Blackberry – Popup is enable
iPhone – Popup is disable
Android – popup is disable

Saturday, November 27, 2010

Building rhodes application for Blackberry


In this blog we will learn to build rhodes application for Blackberry:

Step 1.) You have to purchase  Blackberry JDE Signature Keys. As you have to sign application before loading it to device. You can purchase this from :


This will cost you around 20 US doller.  Signature files can be only registered once per computer. 

Note : You have to enter PIN while filling a form. Please remember this PIN as it will be used later

Step 2.) You will recive 3 .CSI from blackberry. Download this files.

Step3.)  Creating sigtool.csk and sigtool.db files

i)   Double-click on the attachment.
ii)   If a dialog box appears that states that a private key cannot be found, complete steps 3 through 6 before you continue. Otherwise, proceed to step vii.
iii)   Click "Yes" to create a new key pair file.
iv)   Type a password for your private key of at least viii characters, and type it again to confirm.  This is your private key password, which protects your private key. Please remember this password as you will be prompted for it each time signing is attempted or a signature key is installed.
v)   Click "Ok"
vi)   Move your mouse to generate date for a new private key.
vii)   In the "Registration PIN" field, type the PIN number that you supplied on the signature key order form.
viii)   In the Private Key password field, type the password created in step iv.
ix)   Click "Register".
x) Click "Exit".
11) Repeat this process for the other .csi files.

Once this process is complete sigtool.csk and sigtool.db files will be created in bin directory of your Blackberry JDK


Step 4.)Then you can provide password in rhobuild.yml file (located in the Rhodes SDK folder)
build:
   bbsignpwd:

Step 5.) Run this code in your application directory

rake device:bb:production

Step 6.)Now you can check your build in

OTA: /bin/target

You should see many .cod files and one .jad file
Upload all of those files to a web server, then open the .jad file from the browser on your blackberry device

Wednesday, November 10, 2010

Start Rhosync server on specific port

If you run "rake rhosync:start" by default it will start on port 9292. This command call 'rackup config.ru' without specifying the port
To start Rhosync server on Specific Port you can use 


rackup -p <port> config.ru 


Example : rackup -p 80 config.ru 

Wednesday, October 27, 2010

Create a Rhodes application which will sync data from rails application using Rhosync

In this blog we will create a Rhodes application which will synchronize your data from rails application through Rhosync.
We need to create 3 applications
  1. Rails Application: It will feed data in json or XML format.
  2. Rhodes Application: This code will be installed in mobiles.
  3. Rhosync Application: These will sync the data from rails App to Rhodes Application in your phone
Steps to create rails Application:
I will just create a rails application using scaffold:
  1. rails employee_details
  2. cd employee_details
  3. Ruby script/generate scaffold employee name:string phno:integer address:text
  4. Update your database.yml 
  5. Rake db:migrate
  6. Add these code in your employees controller (you can skip this step if you want to only show employee details and does not do crud operations.)
              protect_from_forgery :except => [:create, :update, :delete]
    
    7. Add this line under response in controller:
             
             format.json { render :json => @employee }

    8. Once it is done we will run it on port 3000:

              http://localhost:3000\employees.json

         we will get output in json format.


Steps to create Rhodes application:
  1. Rhogen app employee
  2. Cd employee
  3. Rhogen model employee name,phno,address
  4. Add link in index.erb to your index page
  5. Enable sync in model Employee  
                enable :sync


    6.   Edit rhoconfig.txt file and set
             syncserver = 'http://localhost:9292/application
    7.    rake run:bb


Steps to create Rhosync application:
  1. Rhosync app employee_server
  2. Rhosync source employee
  3. Then employee.erb incude json and rest client
          require 'json'
          require 'rest_client'

     4. Update the query method

  def query(params=nil)
    parsed=JSON.parse(RestClient.get("http://localhost:3000/employees.json").body)
    @result={}
    parsed.each { |item|@result[item["employee"]["id"].to_s]=item["employee"] } if parsed
    @result
  end

Now you can test this by login to your simulator.





Tuesday, October 12, 2010

Bug in rhodes-translator- 0.0.1 template

As metadata in Rhodes is very new, few of the templates in rhodes_translater gem has bugs.
I tried to use select box using metadata. But it's field was not saving the field value.
There is small bug in select.rb in rhodes_translator gem so I modified this file. So to fixed this issue:
Replace the file select.rb in
C:\Ruby187\lib\ruby\gems\1.8\gems\rhodes-translator- 0.0.1\lib\rhodes_translator\templates

with this new select.rb
(Download it from link below)


Saturday, October 9, 2010

Creating a Rhodes Application which will synchronize your tweets to your phone

In this blog I will create a Rhodes application which will sync your tweets through rhosync.

I am currently using Rhodes 2.1.0 and Rhosync 2.0.6.

If you want to some complex operation you can read twitter API docs:

http://dev.twitter.com/doc/get/statuses/user_timeline

Step 1.) Create a Rhodes Application

1.) Go to command prompt and create Rhodes application

>rhogen app twitter-api

>cd twitter-api

>rhogen model twitter text

2.) Now update index.erb( Adding a link to index page of Twitter controller

link_to “Twitter”, :controller => :Twitter


3.) Enable sync in Twitter model.

Update twitter.rb and add the following line

enable sync

4.) Update rhoconfig.txt(Setting the path for rhosync server)

syncserver = ‘http://localhost:9292/application’

5.) Start the simulator

rake run:bb

Step 2.) Create Rhosync Application

1.) Go to command promt

>rhosync app twitter –server

> cd twitter-server

>rhosync source twitter

2.) Update the source adapter twitter.rb

require ‘json’

require ‘open-uri’

Add this code in query method:

def query(params=nil)

parsed=""

open('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=nalwayaabhishek') do |f|

parsed=JSON.parse(f.read)

end

@result = {}

parsed.each do |item|

item_hash = {}

item_hash['text'] = item['text']

@result[item['id'].to_s] = item_hash

end

@result

end

3.) Start redis server

rake redis:start

4.) Start rhosync server

rake rhosync:start

By default it will start on port 9292.


Once the simulater is started Login with any username and password. And sync the data.

Now you can see your tweets even if you are offline.