Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用同步适配器将数据从服务器同步到android SQLite?_Android_Sqlite_Android Sqlite_Android Syncadapter - Fatal编程技术网

如何使用同步适配器将数据从服务器同步到android SQLite?

如何使用同步适配器将数据从服务器同步到android SQLite?,android,sqlite,android-sqlite,android-syncadapter,Android,Sqlite,Android Sqlite,Android Syncadapter,1-创建同步适配器以在后台同步客户端和服务器数据。它作为与应用程序不同的进程执行 2-SQLite不能由多个进程写入 考虑到这两点,我应该如何将从服务器解析的数据写入sqlite数据库?ContentProvider在这种情况下可以工作吗?这是唯一的选择吗 另外,我在这里找到的所有答案都是关于多线程的读/写。在这种情况下,Android实现(使用SQLiteOpenHelper)将序列化对单个db连接的访问。不过,我的问题是,同步适配器作为与应用程序不同的进程运行,因此无法通过Java代码进行同

1-创建同步适配器以在后台同步客户端和服务器数据。它作为与应用程序不同的进程执行

2-SQLite不能由多个进程写入

考虑到这两点,我应该如何将从服务器解析的数据写入sqlite数据库?ContentProvider在这种情况下可以工作吗?这是唯一的选择吗


另外,我在这里找到的所有答案都是关于多线程的读/写。在这种情况下,Android实现(使用SQLiteOpenHelper)将序列化对单个db连接的访问。不过,我的问题是,同步适配器作为与应用程序不同的进程运行,因此无法通过Java代码进行同步。

ContentProvider将完全适合您的目的。它将为您处理IPC。 我是这样做的:

@Override
    public void onPerformSync(Account account, Bundle bundle, String s, ContentProviderClient contentProviderClient, SyncResult syncResult) {
        try {
            ResponseModel response = getAllData(deviceId);
            if (response != null) {
                addDataToDatabase(contentProviderClient, response);
            }
        } catch (RemoteException | RetrofitError exception) {
            e.printStackTrace();
        }
    }

private void addDataToDatabase(ContentProviderClient contentProviderClient, ResponseModel response) throws RemoteException {
        addTasks(contentProviderClient, response);
    }

    private void addTasks(ContentProviderClient contentProviderClient, ResponseModel response) throws RemoteException {
        if (response.getTasks() != null) {
            int size = response.tasksContentValues().size();
            contentProviderClient.bulkInsert(TaskTable.CONTENT_URI,
                    response.tasksContentValues().toArray(new ContentValues[size]));
        }
    }

我是否可以仅在后台进程中使用ContentProvider,并在应用程序中直接使用SqliteDatabase?或者我也应该在内部使用ContentProvider?如果要使用SyncAdapter,它必须有ContentProvider。但是您可以只使用这里提到的虚拟ContentProvider:这就是问题所在,我已经在使用SyncAdapter和虚拟ContentProvider了。但由于SyncAdapter是作为一个不同的进程启动的,所以对数据库的访问不同步,因此在批处理执行的同时使用应用程序时,我会遇到各种各样的错误。