简体   繁体   English

下载大量数据并存储在 Android 和 iOS 上

[英]Downloading large amount of data and storing on Android & iOS

So I have this API that downloads from our web service, but the we service sends it as a ZIP file instead of a json stream or something else.所以我有这个从我们的 Web 服务下载的 API,但我们的服务将它作为 ZIP 文件而不是 json 流或其他东西发送。

Now the files can get quite large butt they are not saved as a ZIP file on the device but are instead unzipped and then saved in a realm database.现在文件可能会变得非常大,它们不会在设备上保存为 ZIP 文件,而是解压缩,然后保存在领域数据库中。

This seems like a extremely complicated way to do this and I would just like to remove the zip part and turn it into a Json streaming service instead.这似乎是一种极其复杂的方法,我只想删除 zip 部分并将其转换为 Json 流服务。

Is that a valid way to do this or is there something else I should be doing?这是一种有效的方法,还是我应该做的其他事情?

The app for context is basically a Form viewer that is intended to have offline mode.上下文应用程序基本上是一个旨在具有离线模式的表单查看器。

[WebMethod]
            public string AndroidGetFormByID(string sessionID, int formID)
            {
                JObject json = new JObject();
                UserDetails user = DBUserHelper.GetUserBySessionID(new Guid(sessionID));
                if (user == null)
                {
                    json["Error"] = "Not logged in";
                    return json.ToString(Newtonsoft.Json.Formatting.None);
                }
                Client client = Client.GetClient(user.ClientID);

                var formTemplateRecord = SqlInsertUpdate.SelectQuery("SELECT JSON, CreatedDate FROM FormTemplates WHERE ID=@ID AND clientID=@clientID", "FormsConnectionString", new List<SqlParameter> { new SqlParameter("@ID", formID), new SqlParameter("@clientID", client.ID) }).GetFirstRow();
                var formJson = formTemplateRecord["JSON"].ToString();

                if (formJson == null)
                {
                    json["Error"] = "No such form";
                    return json.ToString(Newtonsoft.Json.Formatting.None);
                }

                json = JObject.Parse(formJson);
                json["formID"] = formID;
                try
                {
                    json["created"] = Convert.ToDateTime(formTemplateRecord["CreatedDate"]).ToString("dd/MM/yyyy");
                }
                catch (Exception e)
                {
                }
                MemoryStream convertedFormData = new MemoryStream();
                try
                {
                    using (MemoryStream ms = new MemoryStream(json.ToString(Newtonsoft.Json.Formatting.None).ToByteArray()))
                    {
                        ms.Seek(0, SeekOrigin.Begin);
                        using (ZipFile zipedForm = new ZipFile())
                        {
                            zipedForm.AddEntry(json["title"].ToString() + "_" + json["formID"].ToString(), ms);
                            zipedForm.Save(convertedFormData);
                        }
                    }
                }
                catch (Exception ex)
                {
                    return ex.Message.ToString();
                }

                return Convert.ToBase64String(convertedFormData.ToArray());
            }

Also added a bit of java code for context how it is being used:还添加了一些用于上下文的 java 代码,说明它是如何使用的:

 private void getForms ( WeakReference < Context > contextWeakReference, List < Integer > ids )
    {
        AtomicInteger atomicReference = new AtomicInteger( );
        Observable.interval( 1, TimeUnit.SECONDS )
        .map( aLong -> ids.get( aLong.intValue() ) )
        .take( ids.size() )
        .flatMap( integer ->
        {
            atomicReference.set( integer );
            GetFormsListener.setCurrentItem( listOfIds.indexOf( integer ) + 1 );
            FormDBHelper.updateTemplateDownloading( contextWeakReference, atomicReference.get( ), -1,  FormIOHelper.FORM_STATUS.DOWNLOADING.toString() );
            return ServiceGenerator.createService( ).androidGetFormByID( ClientUtils.loginDetailsConstructor.sessionID, String.valueOf( integer ) );}, 1 )
        .map( base64 ->
        {
            final Context context = contextWeakReference.get();
            if(context == null)
                throw new NullPointerException( );


            AppUtils.LogToConsole( Log.ASSERT, "Reached Here Before Write Form", AppUtils.getLoggedTime( ) );
            final File file = FormIOHelper.checkFormFileExists( context.getFilesDir(), atomicReference.get(), "Library", FormIOHelper.FOLDERS.TEMPLATES.toString() );
            FormIOHelper.writeForm( file, base64 );
            AppUtils.LogToConsole( Log.ASSERT, "Reached Here After Write Form", AppUtils.getLoggedTime( ) );
            return file;
        } )
        .map( file ->
        {
            JsonObject formObject = null;
            try
            {
                JsonObject jsonObject = FormIOHelper.getFormFromZipFileAndStrip( file );
                formObject = FormDBHelper.stripFormJson( contextWeakReference, jsonObject, -1 );
            } catch ( Throwable e )
            {
                ErrorLog.log( e );
                FormDBHelper.updateTemplateDownloading( contextWeakReference, atomicReference.get( ), -1, FormIOHelper.FORM_STATUS.ERROR.toString( ) );
            }
            if ( formObject == null )
                return new JsonArray( );

            JsonArray jsonElements;
            if ( formObject.has( "embeddedFiles" ) && formObject.get( "embeddedFiles" ).isJsonArray( ) )
                jsonElements = formObject.get( "embeddedFiles" ).getAsJsonArray( );
            else
                jsonElements = new JsonArray( );
            if ( jsonElements.size( ) > 0 )
            {
                final List < DownloadableFilesConstructor > downloadableFilesConstructorList = FormIOHelper.setEmbeddedFiles( jsonElements );
                Context context = contextWeakReference.get( );
                if ( context == null )
                    return jsonElements;

                DownloadableFilesDBHelper.saveData( context, downloadableFilesConstructorList );
            }
            return jsonElements;
        } )

You can try out Google GSON Stream .您可以试用Google GSON Stream It helps in downloading large amount of data through JSON REST API.它有助于通过 JSON REST API 下载大量数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM