Android 正在将数据库与可穿戴设备同步 - DataMapItems 被覆盖
Android synchronizing database with wearable - DataMapItems are overwritten
我尝试将数据从手持设备上的 SQLite 数据库同步到可穿戴设备。
因此,我在手持设备上使用数据 API 和以下代码:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE");
putRequest.setUrgent();
final DataMap map = putRequest.getDataMap();
int i = 0;
for (String columnName: cursor.getColumnNames()) {
map.putString(columnName,cursor.getString(i));
i++;
}
Wearable.DataApi.putDataItem(googleApiClient, putRequest
.asPutDataRequest()).setResultCallback(new ResultCallback() {
@Override
public void onResult(Result result) {
if (!result.getStatus().isSuccess()) {
Log.v("MainActivity", "data could not be sent");
} else {
Log.v("MainActivity", "data sent");
}
}
});
cursor.moveToNext();
}
cursor.close();
然后在可穿戴设备上我有一个 DataApi.DataListener 来寻找变化:
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
for (DataEvent event : dataEventBuffer) {
String data = null;
try {
data = new String(event.getDataItem().getData(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.v(TAG, "onDataChanged data: "+ data);
if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/SAMPLE")) {
DataMapItem item = DataMapItem.fromDataItem(event.getDataItem());
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "onDataChanged column1: "+ column1_value);
}
}
}
效果很好,我可以将数据库的所有行发送到可穿戴设备并在那里接收它们。
现在我读到没有必要将数据复制到可穿戴设备上的新 SQLite 数据库中,而是直接使用已经将数据存储在自己的数据库中的 DataItembuffer。
例如
How to use DataItem of Android Wear
要么
Android Wear How Long do DataMap entries Stay Valid
但是后面想在某个方法中取回之前同步过的数据的时候,之前发送的20行只取到一个,最后一个。它似乎覆盖了我的项目...但我当然需要所有这些...
public void getDataItems(){
final PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(googleApiClient);
Runnable r = new Runnable() {
@Override
public void run() {
DataItemBuffer dataItems = results.await();
for (int i = 0; i < dataItems.getCount(); i++) {
DataMapItem item = DataMapItem.fromDataItem(dataItems.get(i));
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "getDataItems column1: "+ column1_value);
}
}
};
Thread thread = new Thread(r);
thread.start();
/*
results.setResultCallback(new ResultCallback<DataItemBuffer>() {
@Override
public void onResult(DataItemBuffer dataItems) {
Log.v(TAG, "dataItems length: "+ dataItems.getCount());
for (int i = 0; i < dataItems.getCount(); i++) {
DataMapItem item = DataMapItem.fromDataItem(dataItems.get(i));
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "getDataItems column1: "+ column1_value);
}
dataItems.release();
}
});*/
}
使用 await() 和 ResultCallback 显然没有区别,我总是只得到最后一项...
我做错了什么?
更新:
我注意到使用不同的 URI 会有所不同。如果我使用
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE1");
和
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE2");
然后我在 getDataItems 方法中获得至少两项,但仍然只是每个 URI 的最后一项。
根据文档,每个 DataItem 都由一个通常由节点 ID 和路径组成的 URI 标识。 https://developers.google.com/android/reference/com/google/android/gms/wearable/DataItem
由于使用数百或数千条路径似乎无效,因此问题是 DataItems 是否甚至可以替换 SQLite 数据库...
或者有没有办法在一个 URI 下有多个数据项?
如果您对多个数据项使用相同的 "path",则每次使用该路径放置新数据时,您都在有效地更新数据,这就解释了为什么您只获得 "last" 更新;如果您想单独访问和检索所有内容,则需要为每个路径使用不同的路径或使用不同的数据结构(例如数组)。无论如何,不推荐使用DataApi提供的数据存储来替代sqlite数据库; DataLayer 存储在设计时考虑了一组不同的目标,因此如果您真的想在另一端存储数据以供 运行 查询等,您最好从数据存储中检索它们并将其放入出于您的目的将它们放入您自己的 sqlite 数据库中(并在处理它们时从数据存储中删除这些项目)。
我尝试将数据从手持设备上的 SQLite 数据库同步到可穿戴设备。 因此,我在手持设备上使用数据 API 和以下代码:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE");
putRequest.setUrgent();
final DataMap map = putRequest.getDataMap();
int i = 0;
for (String columnName: cursor.getColumnNames()) {
map.putString(columnName,cursor.getString(i));
i++;
}
Wearable.DataApi.putDataItem(googleApiClient, putRequest
.asPutDataRequest()).setResultCallback(new ResultCallback() {
@Override
public void onResult(Result result) {
if (!result.getStatus().isSuccess()) {
Log.v("MainActivity", "data could not be sent");
} else {
Log.v("MainActivity", "data sent");
}
}
});
cursor.moveToNext();
}
cursor.close();
然后在可穿戴设备上我有一个 DataApi.DataListener 来寻找变化:
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
for (DataEvent event : dataEventBuffer) {
String data = null;
try {
data = new String(event.getDataItem().getData(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.v(TAG, "onDataChanged data: "+ data);
if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/SAMPLE")) {
DataMapItem item = DataMapItem.fromDataItem(event.getDataItem());
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "onDataChanged column1: "+ column1_value);
}
}
}
效果很好,我可以将数据库的所有行发送到可穿戴设备并在那里接收它们。
现在我读到没有必要将数据复制到可穿戴设备上的新 SQLite 数据库中,而是直接使用已经将数据存储在自己的数据库中的 DataItembuffer。 例如 How to use DataItem of Android Wear 要么 Android Wear How Long do DataMap entries Stay Valid
但是后面想在某个方法中取回之前同步过的数据的时候,之前发送的20行只取到一个,最后一个。它似乎覆盖了我的项目...但我当然需要所有这些...
public void getDataItems(){
final PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(googleApiClient);
Runnable r = new Runnable() {
@Override
public void run() {
DataItemBuffer dataItems = results.await();
for (int i = 0; i < dataItems.getCount(); i++) {
DataMapItem item = DataMapItem.fromDataItem(dataItems.get(i));
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "getDataItems column1: "+ column1_value);
}
}
};
Thread thread = new Thread(r);
thread.start();
/*
results.setResultCallback(new ResultCallback<DataItemBuffer>() {
@Override
public void onResult(DataItemBuffer dataItems) {
Log.v(TAG, "dataItems length: "+ dataItems.getCount());
for (int i = 0; i < dataItems.getCount(); i++) {
DataMapItem item = DataMapItem.fromDataItem(dataItems.get(i));
String column1_value = item.getDataMap().getString(column1);
Log.v(TAG, "getDataItems column1: "+ column1_value);
}
dataItems.release();
}
});*/
}
使用 await() 和 ResultCallback 显然没有区别,我总是只得到最后一项...
我做错了什么?
更新: 我注意到使用不同的 URI 会有所不同。如果我使用
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE1");
和
final PutDataMapRequest putRequest = PutDataMapRequest.create("/SAMPLE2");
然后我在 getDataItems 方法中获得至少两项,但仍然只是每个 URI 的最后一项。 根据文档,每个 DataItem 都由一个通常由节点 ID 和路径组成的 URI 标识。 https://developers.google.com/android/reference/com/google/android/gms/wearable/DataItem 由于使用数百或数千条路径似乎无效,因此问题是 DataItems 是否甚至可以替换 SQLite 数据库...
或者有没有办法在一个 URI 下有多个数据项?
如果您对多个数据项使用相同的 "path",则每次使用该路径放置新数据时,您都在有效地更新数据,这就解释了为什么您只获得 "last" 更新;如果您想单独访问和检索所有内容,则需要为每个路径使用不同的路径或使用不同的数据结构(例如数组)。无论如何,不推荐使用DataApi提供的数据存储来替代sqlite数据库; DataLayer 存储在设计时考虑了一组不同的目标,因此如果您真的想在另一端存储数据以供 运行 查询等,您最好从数据存储中检索它们并将其放入出于您的目的将它们放入您自己的 sqlite 数据库中(并在处理它们时从数据存储中删除这些项目)。