Kinvey Android中的离线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

编辑

我完成了这项工作,因为我刚刚丢失了kinvey.properties文件,其中包括app\u key%app\u秘钥。

我正在尝试在Kinvey Android TestDrive应用程序上使用离线Appdata(在线优先策略)功能。如果连接可用,应用程序会直接将数据保存到后端,但它仍然会在后台服务意图方面给我一个错误,该意图是用于无连接模式。 像这样的

    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>


谢谢。

请详细说明您的问题,将代码剪贴贴贴在您需要帮助的地方,这样您将从社区获得更好的帮助检查主要活动代码和清单文件。谢谢我完成了!