Kinvey Android中的离线Appdata同步
编辑 我完成了这项工作,因为我刚刚丢失了kinvey.properties文件,其中包括app\u key%app\u秘钥。 我正在尝试在Kinvey Android TestDrive应用程序上使用离线Appdata(在线优先策略)功能。如果连接可用,应用程序会直接将数据保存到后端,但它仍然会在后台服务意图方面给我一个错误,该意图是用于无连接模式。 像这样的Kinvey Android中的离线Appdata同步,android,background-service,kinvey,Android,Background Service,Kinvey,编辑 我完成了这项工作,因为我刚刚丢失了kinvey.properties文件,其中包括app\u key%app\u秘钥。 我正在尝试在Kinvey Android TestDrive应用程序上使用离线Appdata(在线优先策略)功能。如果连接可用,应用程序会直接将数据保存到后端,但它仍然会在后台服务意图方面给我一个错误,该意图是用于无连接模式。 像这样的 2060-2073/com.example.testdrive.android:backgroundsync E/Android
2060-2073/com.example.testdrive.android:backgroundsync E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[Kinvey Sync Service]
Process: com.example.testdrive.android:backgroundsync, PID: 2060
java.lang.NullPointerException
at com.kinvey.java.AbstractClient$Builder.loadPropertiesFromDisk(AbstractClient.java:353)
at com.kinvey.android.Client$Builder.<init>(Client.java:592)
at com.kinvey.android.offline.AbstractSyncService.initClientAndKickOffSync(AbstractSyncService.java:94)
at com.kinvey.android.offline.AbstractSyncService.onHandleIntent(AbstractSyncService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
2060-2073/com.example.testdrive.android:backgroundsync E/AndroidRuntime﹕ 致命异常:IntentService[Kinvey同步服务]
进程:com.example.testdrive.android:backgroundsync,PID:2060
java.lang.NullPointerException
位于com.kinvey.java.AbstractClient$Builder.loadPropertiesFromDisk(AbstractClient.java:353)
位于com.kinvey.android.Client$Builder(Client.java:592)
位于com.kinvey.android.offline.AbstractSyncService.initClientAndKickOffSync(AbstractSyncService.java:94)
位于com.kinvey.android.offline.AbstractSyncService.OnHandleContent(AbstractSyncService.java:61)
位于android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
运行(HandlerThread.java:61)
onSaveClick方法发送保存请求
测试活动
package com.example.testdrive.android;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.example.testdrive.android.model.Entity;
import com.kinvey.android.AsyncAppData;
import com.kinvey.android.Client;
import com.kinvey.android.callback.KinveyDeleteCallback;
import com.kinvey.android.callback.KinveyListCallback;
import com.kinvey.android.callback.KinveyUserCallback;
import com.kinvey.android.offline.SqlLiteOfflineStore;
import com.kinvey.java.Query;
import com.kinvey.java.User;
import com.kinvey.java.core.KinveyClientCallback;
import com.kinvey.java.model.KinveyDeleteResponse;
import com.kinvey.java.offline.OfflinePolicy;
import java.util.Calendar;
public class TestDrive extends Activity {
public static final String TAG = "TestDrive";
private ProgressBar bar;
private String mydate;
private String appKey="kid_VeZoHqKOZ9";
private String appSecret="8311c26bf1f546c785aa894da1139f3e";
private Client kinveyClient;
private AsyncAppData<Entity> ad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_drive);
bar = (ProgressBar) findViewById(R.id.refresh_progress);
bar.setIndeterminate(true);
kinveyClient = new Client.Builder(appKey, appSecret, TestDrive.this).build();
if (!kinveyClient.user().isUserLoggedIn()) {
bar.setVisibility(View.VISIBLE);
kinveyClient.user().login(new KinveyUserCallback() {
@Override
public void onSuccess(User result) {
bar.setVisibility(View.GONE);
Log.i(TAG,"Logged in successfully as " + result.getId());
Toast.makeText(TestDrive.this, "New implicit user logged in successfully as " + result.getId(),
Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Throwable error) {
bar.setVisibility(View.GONE);
Log.e(TAG, "Login Failure", error);
Toast.makeText(TestDrive.this, "Login error: " + error.getMessage(), Toast.LENGTH_LONG).show();
}
});
} else {
Toast.makeText(this, "Using cached implicit user " + kinveyClient.user().getId(), Toast.LENGTH_LONG).show();
}
ad = kinveyClient.appData("entityCollection", Entity.class);
ad.setOffline(OfflinePolicy.ONLINE_FIRST, new SqlLiteOfflineStore<Entity>(this));
}
public void onSaveClick(View view) {
bar.setVisibility(View.VISIBLE);
mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
Entity entity = new Entity("myEntity"+mydate
);
entity.put("Description","This is a description of a dynamically-added Entity property.");
ad.save(entity, new KinveyClientCallback<Entity>() {
@Override
public void onSuccess(Entity result) {
bar.setVisibility(View.GONE);
Toast.makeText(TestDrive.this, "Entity Saved\nTitle: " + result.getTitle()
+ "\nDescription: " + result.get("Description"), Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Throwable error) {
bar.setVisibility(View.GONE);
Log.e(TAG, "AppData.save Failure", error);
Toast.makeText(TestDrive.this, "Save All error: " + error.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
}
package com.example.testdrive.android;
导入android.app.Activity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.ProgressBar;
导入android.widget.Toast;
导入com.example.testdrive.android.model.Entity;
导入com.kinvey.android.AsyncAppData;
导入com.kinvey.android.Client;
导入com.kinvey.android.callback.KinveyDeleteCallback;
导入com.kinvey.android.callback.KinveyListCallback;
导入com.kinvey.android.callback.KinveyUserCallback;
导入com.kinvey.android.offline.SqlLiteOfflineStore;
导入com.kinvey.java.Query;
导入com.kinvey.java.User;
导入com.kinvey.java.core.KinveyClientCallback;
导入com.kinvey.java.model.KinveyDeleteResponse;
导入com.kinvey.java.offline.OfflinePolicy;
导入java.util.Calendar;
公共类TestDrive扩展了活动{
公共静态最终字符串TAG=“TestDrive”;
私人酒吧;
私有字符串mydate;
私有字符串appKey=“kid_VeZoHqKOZ9”;
私有字符串appSecret=“8311C26BF1F546C785AA894DA113F3E”;
私人客户近亲客户;
私有数据广告;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u test\u drive);
bar=(ProgressBar)findviewbyd(R.id.refresh\u progress);
bar.setUndeterminate(真);
kinveyClient=new Client.Builder(appKey、appSecret、TestDrive.this).build();
如果(!kinveyClient.user().isUserLoggedIn()){
bar.setVisibility(View.VISIBLE);
kinveyClient.user().login(新的KinveyUserCallback()){
@凌驾
成功时公共无效(用户结果){
bar.setVisibility(View.GONE);
Log.i(标记“作为”+result.getId()成功登录);
Toast.makeText(TestDrive.this,“新隐式用户以”+result.getId()的身份成功登录,
Toast.LENGTH_LONG).show();
}
@凌驾
失败时公共无效(可丢弃错误){
bar.setVisibility(View.GONE);
Log.e(标签“登录失败”,错误);
Toast.makeText(TestDrive.this,“登录错误:+error.getMessage(),Toast.LENGTH\u LONG.show();
}
});
}否则{
Toast.makeText(这是“使用缓存的隐式用户”+kinveyClient.user().getId(),Toast.LENGTH_LONG.show();
}
ad=kinveyClient.appData(“entityCollection”,Entity.class);
ad.setOffline(OfflinePolicy.ONLINE_优先,新SqlLiteOfflineStore(this));
}
保存上的公共无效单击(查看){
bar.setVisibility(View.VISIBLE);
mydate=java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
实体实体=新实体(“myEntity”+mydate
);
entity.put(“Description”,“这是对动态添加的实体属性的描述”);
保存(实体,新KinveyClientCallback(){
@凌驾
成功时公共作废(实体结果){
bar.setVisibility(View.GONE);
Toast.makeText(TestDrive.this,“实体已保存”\n title:+result.getTitle()
+“\n说明:”+result.get(“说明”),Toast.LENGTH\u LONG.show();
}
@凌驾
失败时公共无效(可丢弃错误){
bar.setVisibility(View.GONE);
Log.e(标签“AppData.save Failure”,错误);
Toast.makeText(TestDrive.this,“保存所有错误:+error.getMessage(),Toast.LENGTH\u LONG.show();
}
});
}
}
KinveySyncService不会被触发
AndroidMainifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testdrive.android"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.example.testdrive.android.TestDrive"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.kinvey.android.offline.KinveySyncService"
android:exported="true" android:process=":backgroundsync" >
<intent-filter>
<action android:name="com.kinvey.android.ACTION_OFFLINE_SYNC" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</service>
</application>
</manifest>
谢谢。请详细说明您的问题,将代码剪贴贴贴在您需要帮助的地方,这样您将从社区获得更好的帮助检查主要活动代码和清单文件。谢谢我完成了!