Использование существующей базы данных в Android Wear

Я пытаюсь создать приложение для ношения для моего существующего приложения. У меня уже есть база данных SQLite в моем портативном приложении, теперь я хочу попробовать использовать ее в своем приложении для ношения.

Есть ли у них возможность отправить базу данных в Wear или я могу получить доступ к базе данных на своем КПК из приложения Wear?

Моя текущая идея состоит в том, чтобы передать все элементы через Wearable.DataApi, но это не похоже на лучшее решение.

Например, я не верю, что Google Keep передает все заметки отдельно.

Любая другая идея?


person MDXDave    schedule 24.09.2014    source источник


Ответы (2)


Я нашел быстрое решение для переноса всей базы данных с телефона на SmartWatch.

Сначала я создаю вспомогательный класс, который преобразует содержимое моей базы данных в строку json, которую можно отправить на умные часы с помощью 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 (телефон):

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 (износ)

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);
}
}

Добавить в AndroidManifest.xml (износ)

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

Получив json-строку на своей одежде, вы можете сохранить их в базе данных на своей одежде или сделать с ней что-то еще...

Я думаю, что это самый простой способ передачи таких данных между карманным устройством и носимым устройством.

person MDXDave    schedule 03.10.2014

Вы, вероятно, не захотите отправлять всю базу данных на носимое устройство. Вместо этого вам следует использовать доступные протоколы обмена сообщениями (WearableListenerService) для связи с базой данных, которая уже находится на портативном устройстве.

Вот документация по этому поводу: http://developer.android.com/training/wearables/data-layer/events.html.

person brwngrldev    schedule 24.09.2014
comment
Но если кто-то хочет иметь возможность использовать приложение Wear в автономном режиме (без мобильного телефона), это может быть хорошим решением. - person riper; 12.10.2014