App42 Android не работает автономное хранилище
Я создаю приложение для Android и хочу использовать автономное хранилище. Итак, я создал тестовое приложение для тестирования app42 BaaS. App42 был инициализирован в TestApplication.java. Приложение должно сохранять информацию в автономном хранилище (информация о "Тоня" в строке JSON), а когда интернет-соединение доступно, оно должно отправлять эту информацию в онлайн-базу данных. Ну, согласно журналу, "Тоня" была написана в автономном режиме, но она не появляется, когда я использую "findAllDocuments". И когда интернет-соединение стало доступным, оно не синхронизировалось с онлайн-базой данных. Я пытался использовать разные версии Android и SDK, это не помогло. Что я делаю неправильно?
Это AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.luka94.testapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<application
android:name=".TestApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.shephertz.app42.paas.sdk.android.App42BroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:name="com.shephertz.app42.paas.sdk.android.AlarmReceiver"/>
<service android:name="com.shephertz.app42.paas.sdk.android.App42DataSyncService"/>
</application>
</manifest>
Это TestApplication.java:
package com.luka94.testapplication;
import android.app.Application;
import com.shephertz.app42.paas.sdk.android.App42API;
import com.shephertz.app42.paas.sdk.android.App42CacheManager;
import com.shephertz.app42.paas.sdk.android.App42Response;
import com.shephertz.app42.paas.sdk.android.App42Exception;
import com.shephertz.app42.paas.sdk.android.App42BadParameterException;
import com.shephertz.app42.paas.sdk.android.App42NotFoundException;
import com.shephertz.app42.paas.sdk.android.App42CallBack;
import com.shephertz.app42.paas.sdk.android.storage.StorageService;
import com.shephertz.app42.paas.sdk.android.user.User;
import com.shephertz.app42.paas.sdk.android.user.User.Profile;
import com.shephertz.app42.paas.sdk.android.user.User.UserGender;
import com.shephertz.app42.paas.sdk.android.user.UserService;
public class TestApplication extends Application {
private UserService userService;
private StorageService storageService;
public static final String DB_NAME = "DBNAME";
@Override
public void onCreate() {
super.onCreate();
App42API.initialize(getApplicationContext(), "KEY_1", "KEY_2");
App42CacheManager.setPolicy(App42CacheManager.Policy.NETWORK_FIRST);
App42CacheManager.setExpiryInMinutes(60);
userService = App42API.buildUserService();
storageService = App42API.buildStorageService();
App42API.setOfflineStorage(true);
}
public UserService getUserService() {
return userService;
}
public StorageService getStorageService() {return storageService;}
}
Это MainActivity.java:
package com.luka94.testapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.shephertz.app42.paas.sdk.android.App42API;
import com.shephertz.app42.paas.sdk.android.App42CallBack;
import com.shephertz.app42.paas.sdk.android.storage.Storage;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private TestApplication mApplication;
private String json;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (TestApplication) getApplication();
json = "{\"name\":\"Tonya\",\"age\":\"28\",\"phone\":\"xxx-xxx-xxx\"}";
testWriteData();
getRecord();
}
private void getRecord() {
mApplication.getStorageService().findAllDocuments(TestApplication.DB_NAME,
"test", new App42CallBack() {
@Override
public void onSuccess(Object o) {
ArrayList<Storage.JSONDocument> jsonDocList = ((Storage) o).getJsonDocList();
if (!jsonDocList.isEmpty()) {
Log.d("TestApp", "objects finded");
for (int i = 0; i < jsonDocList.size(); i++) {
Log.d("TestApp", String.format("%s", jsonDocList.get(i).toString()));
}
}
Log.d("TestApp", String.format("is from online storage: %b", ((Storage) o).isOfflineSync()));
Log.d("TestApp", String.format("is from cache: %b", ((Storage) o).isFromCache()));
}
@Override
public void onException(Exception e) {
Log.d("TestApp", e.getMessage());
}
});
}
private void testWriteData() {
mApplication.getStorageService().insertJSONDocument(TestApplication.DB_NAME, "test", json, new App42CallBack() {
@Override
public void onSuccess(Object response) {
Storage storage = (Storage) response;
if (storage.isOfflineSync()) {
Log.d("TestApp", "writed offline");
} else {
Log.d("TestApp", "writed online");
}
}
@Override
public void onException(Exception ex) {
System.out.println("Exception Message : " + ex.getMessage());
}
});
}
}
1 ответ
Автономное хранилище App42 хранит ответ на вызов API типа GET. Когда тот же вызов API будет выполнен снова, а затем на основе установленной вами политики, вам будет доставлен ответ, который может быть с сервера или из кэша. Это будет работать, только если сигнатура метода одинакова. Он кэширует ответ на этот запрос и доставляет его для следующего вызова. Если вы делаете другой вызов API для получения соответствующих данных, вы не будете получать данные ответа. Вы также можете взглянуть на его документацию для получения дополнительной информации.
Надеюсь, это поможет.