Beginning and Intermediate Core Data – YouTube

original source : https://www.youtube.com/watch?v=0kmQA0aBIfM&index=14&list=PL23Revp-82LImHA8jL2dLaN_67pABFcyJ

core data stack을 보통 app delegate부분에서 초기화작업을 하는데 이런경우 복잡해지고 다른 프로젝트에서 사용이 불가능하므로 따로 초기화 작업을 하는 class를 만드는 작업을 설명한다.

Core Data and Swift: Data Model

Storyboards Tutorial for iOS: Part 1

A guide to the Android Wear Message API | Java

  • wear에서 mobile로 전달할 data가 있는 경우 data item, 

    DataMapItem 또는 message, assets등등의 방법을 이용할수 있다. 쌍방의 통신이 필요한경우는 DataItem , DataMapItem을 이용하면되고 일방의 통신의 경우는 Message를 이용할수 있다. (RPC 처럼 사용 가능) 

  • Message를 사용하는 경우(DataItem,DataMapItem의 경우는 사용해보지 않아서 같은지 아직 모름) 일단 네트워크의 node를 확인해야한다. 그리고 가장 가까운 기기기 node(mobile인경우가 대부분)가 접속되었는지, 또 message작업이 가능한지 capability를 확인해야 한다. 그리고 나서 data는 byte[]의 형태로 MessageApi.sendMessage를 통해 전달된다. 그리고 message를 mobile에서 받는 경우 두가지 경우를 생각할수 있다. 
  1. 사용자가 app을 사용하고 있는 경우
  2. 사용자가 app을 사용하지 않고 있는 경우

첫번째 경우에만 통신이 필요한경우는  MessageApi.MessageListener를 inplements 한 activity가 받아들이면된다. 후자의 경우는 service를 이용해서 받는다.

original source: https://developer.android.com/training/wearables/data-layer/data-items.html

Syncing Data Items

A DataItem defines the data interface that the system uses to synchronize data between handhelds and wearables.

Payload – A byte array, which you can set with whatever data you wish. 크기는  100kb

Path – A unique string that must start with a forward slash

normally don’t implement DataItem directly. Instead, you do the following:

  1. Create a PutDataRequest object, specifying a string path to uniquely identify the item.
  2. Call setData() to set the payload.
  3. If a delay in syncing would negatively impact user experience, call setUrgent().
  4. Call DataApi.putDataItem() to request the system to create the data item.

Sync Data with a Data Map

use the DataMap class. This approach lets you work with data items in the form of an Android Bundle, so the system does object serialization and deserialization for you, and you can manipulate data with key-value pairs.

  1. Create a PutDataMapRequest object, setting the path of the data item.
  2. Call PutDataMapRequest.getDataMap() to obtain a data map that you can set values on.
  3. Set any desired values for the data map using the put...() methods, such as putString().
  4. If a delay in syncing would negatively impact user experience, call setUrgent().
  5. Call PutDataMapRequest.asPutDataRequest() to obtain a PutDataRequest object.
  6. Call DataApi.putDataItem() to request the system to create the data item.

Note: If the handset and wearable devices are disconnected, the data is buffered and synced when the connection is re-established.

ex)

public class MainActivity extends Activity implements
       DataApi.DataListener,
       GoogleApiClient.ConnectionCallbacks,
       GoogleApiClient.OnConnectionFailedListener {

   private static final String COUNT_KEY = "com.example.key.count";

   private GoogleApiClient mGoogleApiClient;
   private int count = 0;

   ...

   // Create a data map and put data in it
   private void increaseCounter() {
       PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
       putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
       PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
       PendingResult<DataApi.DataItemResult> pendingResult =
               Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq);
   }

   ...
}

Set DataItem priority

In Google Play services 8.3 and later, the DataApi interface allows urgent requests for syncing of DataItems.
setUrgent() 을 설정한다.

Listen for Data Item Events

public class MainActivity extends Activity implements
       DataApi.DataListener,
       GoogleApiClient.ConnectionCallbacks,
       GoogleApiClient.OnConnectionFailedListener {

   private static final String COUNT_KEY = "com.example.key.count";

   private GoogleApiClient mGoogleApiClient;
   private int count = 0;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       mGoogleApiClient = new GoogleApiClient.Builder(this)
               .addApi(Wearable.API)
               .addConnectionCallbacks(this)
               .addOnConnectionFailedListener(this)
               .build();
   }

   @Override
   protected void onResume() {
       super.onResume();
       mGoogleApiClient.connect();
   }

   @Override
   public void onConnected(Bundle bundle) {
       Wearable.DataApi.addListener(mGoogleApiClient, this);
   }

   @Override
   protected void onPause() {
       super.onPause();
       Wearable.DataApi.removeListener(mGoogleApiClient, this);
       mGoogleApiClient.disconnect();
   }

   @Override
   public void onDataChanged(DataEventBuffer dataEvents) {
       for (DataEvent event : dataEvents) {
           if (event.getType() == DataEvent.TYPE_CHANGED) {
               // DataItem changed
               DataItem item = event.getDataItem();
               if (item.getUri().getPath().compareTo("/count") == 0) {
                   DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                   updateCount(dataMap.getInt(COUNT_KEY));
               }
           } else if (event.getType() == DataEvent.TYPE_DELETED) {
               // DataItem deleted
           }
       }
   }

   // Our method to update the count
   private void updateCount(int c) { ... }

   ...
}