Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using existing database in Android Wear

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?

like image 661
MDXDave Avatar asked Sep 24 '14 16:09

MDXDave


People also ask

Does Android Wear still exist?

In May 2021 at Google I/O, Google announced a major update to the platform, internally known as Wear OS 3.0. It incorporates a new visual design inspired by Android 12, and Fitbit exercise tracking features.

Do all Android apps work on Wear OS?

Tip: Not all apps available for Android phones are also available for Wear OS watches. If you don't have the option to install the app on your watch, it's probably not compatible with Wear OS. When you install an app which works on Wear OS on your phone you can install it on your watch as well.

Why should I migrate from SQLite to room database in Android?

The Room persistence library provides a number of benefits over using the SQLite APIs directly: Compile-time verification of SQL queries. Convenience annotations that minimize repetitive and error-prone boilerplate code. Streamlined database migration paths.


1 Answers

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.

like image 199
MDXDave Avatar answered Oct 19 '22 07:10

MDXDave