Using existing database in Android Wear
Asked Answered
C

2

6

I'm try to build a wear-app for my existing app. I already have an SQLite Database in my Handheld-App, now i want to try to use them in my wear app.

Is their any possibility to send the database to the Wear or can i access the database on my handheld from the wear app?

My current idea is to transfer all items via Wearable.DataApi, but that's sounds not like the best solution.

For example, i don't believe that Google Keep transfer all the notes separately.

Anyone another idea?

Crossbow answered 24/9, 2014 at 16:13 Comment(0)
C
8

I've found a quick Solution for transfering the whole database from phone to Smartwatch.

First i create a helper class which converts my database content into a json-string, that can be send to smartwatch by using the Wearable.DataApi:

DatabaseToJSON.java:

public class DatabaseToJSON {
DatabaseHandler dbhandler;

public DatabaseToJSON(Context context) {
    dbhandler = new DatabaseHandler(context);
}

public JSONObject getJSON() throws JSONException{
    Item[] item = null;
    JSONObject pl = new JSONObject();
    item = dbhandler.getItems();
    dbhandler.close();
    JSONArray jsonArray = new JSONArray();  
    for(int i=0;i<item.length;i++){
        JSONObject val = new JSONObject();
        try {
            val.put("id", item[i].getID());
            val.put("name", item[i].getName());
            ...
            jsonArray.put(val);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        pl.put(String.valueOf(j), jsonArray);
    }

     if(jsonArray.length()<1){
       pl.put(String.valueOf(j),new JSONArray());
     }

    }

    JSONObject result = new JSONObject();
    result.put("data",pl);
    return result;      
} }

DemoActivity.java (Phone):

public class DemoActivity extends Activity implements  GoogleApiClient.ConnectionCallbacks,  GoogleApiClient.OnConnectionFailedListener {

/** Android Wear **/
GoogleApiClient googleClient;

@Override
public void onStart(){
    super.onStart();
    googleClient.connect();
}


@Override
public void onStop(){
    if (null != googleClient && googleClient.isConnected()) {
        googleClient.disconnect();
    }
    super.onStop();
}

 @Override
 protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     googleClient = new GoogleApiClient.Builder(this)
             .addApi(Wearable.API)
             .addConnectionCallbacks(this)
             .addOnConnectionFailedListener(this)
             .build();

     ...
}

@Override
public void onConnected(Bundle bundle) {

    DatabaseToJSON dbJson = new DatabaseToJSON(DemoActivity.this);
    try {
        JSONObject json = dbJson.getJSON();
        new SendToDataLayerThread("/path", json.toString()).start();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

class SendToDataLayerThread extends Thread {
    String path;
    String message;

    SendToDataLayerThread(String p, String msg) {
        path = p;
        message = msg;
    }

    public void run() {
        NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(googleClient).await();
        for (Node node : nodes.getNodes()) {
            MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(googleClient, node.getId(), path, message.getBytes()).await();
            if (result.getStatus().isSuccess()) {
                Log.v("myTag", "Message: {" + message + "} sent to: " + node.getDisplayName());
            }
            else {
                Log.v("myTag", "ERROR: failed to send Message");
            }
        }
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

}

DataLayerListenerService.java (wear)

public class DataLayerListenerService extends WearableListenerService {

@Override
public void onMessageReceived(MessageEvent messageEvent) {

if (messageEvent.getPath().equals("/path")) {
    final String message = new String(messageEvent.getData());


    // do what you want with the json-string
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    SharedPreferences.Editor edit = pref.edit();
    edit.putString("demo_json",message).apply();

}
else {
    super.onMessageReceived(messageEvent);
}
}

Add to AndroidManifest.xml (wear)

 <service android:name=".DataLayerListenerService" >
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>

After receiving the json-string on your wear you can save them within a database on your wear or do something else with it...

I think thats the simplest way to transfer such data between handheld and wear device.

Crossbow answered 3/10, 2014 at 19:3 Comment(0)
B
0

You probably wouldn't want to send an entire database to the wearable. Rather you should use the messaging protocols available (WearableListenerService) to you in order to communicate with the database that is already on the handheld.

Here are the docs on that: http://developer.android.com/training/wearables/data-layer/events.html.

Brassy answered 24/9, 2014 at 20:49 Comment(1)
But if one wants to be able to use the wear app offline (without mobile) this might be a good solution.Patrilocal

© 2022 - 2024 — McMap. All rights reserved.