android - 使用 AbstractThreadedSyncAdapter 同步 Android 数据库 : onPerformSync isn't called

标签 android sqlite service synchronization android-syncadapter

我正在尝试使用 AbstractThreadedSyncAdapter 将本地数据库与服务器同步。我已按照我找到的指南进行操作,但无法使其正常工作。适用于 Android 2.2。

我的身份验证器系统正在运行。在我的 AccountAuthenticatorActivity 中,创建帐户后,我执行以下操作:

Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.addPeriodicSync(account, "com.syncal.authority", params, 30);
ContentResolver.setSyncAutomatically(account, "com.syncal.authority", true);
ContentResolver.requestSync(account,"com.syncal.authority",params);

我创建了 SyncService 并在 list 中声明了它。部分功能:

@Override
public IBinder onBind(Intent intent) {
    Log.i(TAG, "inBind() " + intent.getAction());
    return getSyncAdapter().getSyncAdapterBinder();
}

private synchronized AbstractThreadedSyncAdapter getSyncAdapter() {
    Log.i(TAG, "getSyncAdapter()");
    if (mSyncAdapter == null) {
         mSyncAdapter = new SweetSyncAdapter(this, true);
    }
    return mSyncAdapter;
}

然后我实现了我的 SyncAdapter。 onPerformSync 函数是空的,我只想知道它是否被调用,而且它从未被调用。

public class SweetSyncAdapter extends AbstractThreadedSyncAdapter {

    Context mContext;
    private String AUTH_TOKEN_TYPE;
    private AccountManager mAccountManager;
    private String mAuthToken;
    private final String TAG = "SweetContactSync";
    static final String LAST_SYNC_KEY = "lastSync";

    public SweetSyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
        Log.i(TAG, "SweetSyncAdapter");
        mContext = context;
        AUTH_TOKEN_TYPE = mContext.getString(R.string.account_type);
        mAccountManager = AccountManager.get(mContext);
    }

    public interface ISugarRunnable {
         public void run() throws URISyntaxException, OperationCanceledException, AuthenticatorException, IOException,
            AuthenticationException;
    }

    class SugarRunnable implements Runnable {
        ISugarRunnable r;
        Account mAccount;
        SyncResult mSyncResult;

        public SugarRunnable(Account acc, SyncResult syncResult, ISugarRunnable _r) {
            r = _r;
            mAccount = acc;
            mSyncResult = syncResult;
        }

        public void run() {
            try {
                r.run();
    } catch ... //All the catchs
        }
    }

    @Override
    public void onPerformSync(final Account account, Bundle extras, String authority,
                ContentProviderClient provider, SyncResult syncResult) {
        Log.i(TAG, "onPerformSync()");
    }
}

我的 xml/sync_adapter.xml 有以下代码:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.syncal.authority"
    android:accountType="com.syncal.account"   
/>

这是 list 的服务部分:

<service android:name=".sweet.SweetSyncService" android:exported="true"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>

    <meta-data android:name="android.content.SyncAdapter"
        android:resource="@xml/sync_adapter" />

</service>

我什至创建了自己的ContentProvider(函数是空的,它们只是写在日志中),因为我遵循的指南说它是需要的,并且我也在 list 中声明了它,但没有调用任何函数。

有人知道为什么我的 onPerformSync 函数没有被调用吗?我的 SweetSyncService 的 onBind 函数被调用,它创建了我的 SweetSyncAdapter,但从这里开始我的日志不再显示任何消息。

感谢您的阅读,我知道我输入了很多代码,但我已经研究了一段时间,但无法修复它。

最佳答案

我终于找到了错误所在。我在 list 中添加了一些权限,现在它可以工作了:

<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

关于android - 使用 AbstractThreadedSyncAdapter 同步 Android 数据库 : onPerformSync isn't called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099805/

相关文章:

linux - 如何在 linux Centos 6 上创建服务

android - 使用 getSherlockActivity() 或 getActivity() 或其他?

android - MutableLiveData<Pair<Float, Float>>() -> Val 不能被重新赋值

java - Android 应用程序中的 NumberFormatException

sql - 在同一查询中使用两个聚合函数

java - OSGI 声明式服务 (DS) : What is a good way of using service component instances

android - 作为 "Private"(仅限本地)文件夹/文件选择器的存储访问框架?

android - 形状渲染器增加正方形尺寸不均匀

c# - 如何在没有大条件的情况下创建兼容SQL Server和SQLite的DbCommand?

android - 在 Android 后台运行 GPS 监听器