2014-09-24 5 views
6

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

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

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

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

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

ответ

8

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

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

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-строку на вашем износе вы можете сохранить их в базе данных на ваша одежда или что-то еще с этим ...

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

+0

Хорошее решение, отлично работало для меня;) – Mauker

0

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

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

+4

Но если вы хотите использовать приложение для ношения офлайн (без мобильного), это может быть хорошим решением. – riper