zoukankan      html  css  js  c++  java
  • Android 与 Webservice 的快速保存

    前面写了一篇android对sqllite的快速保存博客,今天我们来看看android与webservice的交互,相信很多有经验的人自然就想到了soap。但是如果在小型项目中,具有大材小用之嫌。实际上java本身就提供了一套可以与webservice交付的功能,也十分简单。因此对于小型项目而言,我们何不封装一下该方法。

    下面我们来看下我们要做的内容:

    1)从远程站点上获取数据。

    2) 判断数据是否是json格式的,如果是那么我们能不能通过转换将json格式的直接转换为entity返回。如果不是json格式的,那么我们能不能返还回该值。

    首先我们来解决第一点,andoird对数据的处理,都是放在多线程上面去所以我们建立一个AsyncTask来管理。

    private static class NewsGetTask extends
                AsyncTask<String, IredeemError, String> {
    
            private ProgressDialog pDialog;
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                 pDialog = new ProgressDialog(MainActivity.getInstance());
                 pDialog.setMessage("Please waiting...");
                 pDialog.setIndeterminate(false);
                 pDialog.setCancelable(true);
                 pDialog.show();
            }
    
            /*
             * (non-Javadoc)
             * 
             * @see android.os.AsyncTask#doInBackground(Params[])
             */
            @Override
            protected String doInBackground(String... params) {
    
                String url = params[0];    
                
                if(!URLUtil.isValidUrl(url))
                {
                    return IredeemApplication.getInstance().getString("UnConnection");
                }
                
                String data = null;
            
                if (requestCache != null) {
                    data = requestCache.get(url);
                    if (data != null) {
                        return data;
                    }
                }
                // initialize HTTP GET request objects
                BasicHttpParams httpParameters = new BasicHttpParams();// Set the timeout in milliseconds until a connection is established.  
                HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);// Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data.  
                HttpConnectionParams.setSoTimeout(httpParameters, 5000); 
                    
                HttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpGet httpGet = new HttpGet(url);
                HttpResponse httpResponse = null;
    
                try {
                    // execute request
                    try {        
                        httpResponse = httpClient.execute(httpGet);
                    } catch (UnknownHostException e) {
                        return e.getMessage();
                        // throw wsError;
                    } catch (SocketException e) {
                        return e.getMessage();
                        // throw wsError;
                    }
    
                    // request data
                    HttpEntity httpEntity = httpResponse.getEntity();
    
                    if (httpEntity != null) {
                        InputStream inputStream = httpEntity.getContent();
                        data = convertStreamToString(inputStream);
                        // cache the result
                        
                    //    todo: remove out the cash
                        if (requestCache != null) {
                            requestCache.put(url, data);
                        }
                    }
    
                } catch (ClientProtocolException e) {
                    return e.getLocalizedMessage();
                } catch (IOException e) {
                    return e.getMessage();
                }
                return data;
            }
    
            protected void onPostExecute(String message) {
                pDialog.dismiss();
            }
        }

    我们在线程中率先验证一下URL是不是可用,URLUtil主要就是一个字符串匹配严重是否合法。接着我们设置一下连接的超时时间,然后再Try catch里面去获取该数据,并返回。第一步便完成了。这时候我们需要写个类来调用:调用方法如下:

    public static String doGet(String url) {
            try {
                 return (new NewsGetTask().execute(url)).get();
            } catch (InterruptedException e) {
                return e.getMessage();
            } catch (ExecutionException e) {
                return e.getMessage();
            }
        }

    整合下第一步将全部代码传上来:

    package com.iredeem.util;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.SocketException;
    import java.net.URL;
    import java.net.UnknownHostException;
    import java.util.concurrent.ExecutionException;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpConnectionParams;
    import org.json.JSONObject;
    
    import com.iredeem.IredeemApplication;
    import com.iredeem.activity.MainActivity;
    
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.webkit.URLUtil;
    
    /**
     * @author xie
     */
    public class Caller {
    
        /**
         * Cache for most recent request
         */
        private static RequestCache requestCache = null;
    
        /**
         * Performs HTTP GET using Apache HTTP Client v 4
         * 
         * @param url
         * @return
         * @throws WSError
         */
        public static String doGet(String url) {
            try {
                 return (new NewsGetTask().execute(url)).get();
            } catch (InterruptedException e) {
                return e.getMessage();
            } catch (ExecutionException e) {
                return e.getMessage();
            }
        }
        
        private static Boolean isConnection(String urlString) {
            try {
    
                URL url = new URL(urlString);
                HttpURLConnection urlc = (HttpURLConnection) url
                        .openConnection();
    
                urlc.setRequestProperty("User-Agent",
                        "Android Application:***");
    
                urlc.setRequestProperty("Connection", "close");
    
                urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
    
                urlc.connect();
    
                if (urlc.getResponseCode() == 200) {
    
                    return true;
                }
    
            } catch (MalformedURLException e1) {
    
                e1.printStackTrace();
    
            } catch (IOException e) {
    
                e.printStackTrace();
            }
            return false;
        }
    
        
        private static class NewsGetTask extends
                AsyncTask<String, IredeemError, String> {
    
            private ProgressDialog pDialog;
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                 pDialog = new ProgressDialog(MainActivity.getInstance());
                 pDialog.setMessage("Please waiting...");
                 pDialog.setIndeterminate(false);
                 pDialog.setCancelable(true);
                 pDialog.show();
            }
    
            /*
             * (non-Javadoc)
             * 
             * @see android.os.AsyncTask#doInBackground(Params[])
             */
            @Override
            protected String doInBackground(String... params) {
    
                String url = params[0];    
                
                if(!URLUtil.isValidUrl(url))
                {
                    return IredeemApplication.getInstance().getString("UnConnection");
                }
                
                String data = null;
            
                if (requestCache != null) {
                    data = requestCache.get(url);
                    if (data != null) {
                        return data;
                    }
                }
                // initialize HTTP GET request objects
                BasicHttpParams httpParameters = new BasicHttpParams();// Set the timeout in milliseconds until a connection is established.  
                HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);// Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data.  
                HttpConnectionParams.setSoTimeout(httpParameters, 5000); 
                    
                HttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpGet httpGet = new HttpGet(url);
                HttpResponse httpResponse = null;
    
                try {
                    // execute request
                    try {        
                        httpResponse = httpClient.execute(httpGet);
                    } catch (UnknownHostException e) {
                        return e.getMessage();
                        // throw wsError;
                    } catch (SocketException e) {
                        return e.getMessage();
                        // throw wsError;
                    }
    
                    // request data
                    HttpEntity httpEntity = httpResponse.getEntity();
    
                    if (httpEntity != null) {
                        InputStream inputStream = httpEntity.getContent();
                        data = convertStreamToString(inputStream);
                        // cache the result
                        
                    //    todo: remove out the cash
                        if (requestCache != null) {
                            requestCache.put(url, data);
                        }
                    }
    
                } catch (ClientProtocolException e) {
                    return e.getLocalizedMessage();
                } catch (IOException e) {
                    return e.getMessage();
                }
                return data;
            }
    
            protected void onPostExecute(String message) {
                pDialog.dismiss();
            }
        }
    
        private static String convertStreamToString(InputStream is) {
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
    
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "
    ");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            return sb.toString();
        }
    
        public static void setRequestCache(RequestCache requestCache) {
            Caller.requestCache = requestCache;
        }
    
        public static String createStringFromIds(int[] ids) {
            if (ids == null)
                return "";
    
            String query = "";
    
            for (int id : ids) {
                query = query + id + "+";
            }
    
            return query;
        }
    
    }

    接着我们来解决第二步:

    我们先建立一个BaseEntity的基类。

    public class BaseEntity implements Serializable {
    
        private static final long serialVersionUID = 1L;
        
        public static final String DB_NAME = IredeemApplication.DataInformation.DB_NAME;
    
        private static final String Tag = "Base Entity";
    
        public<T extends Serializable> void set(Class<T> clazz, String fieldName,Object obj)
        {
            Class<? extends BaseEntity> cls = this.getClass();
            Field filed = null;
            try {
                filed = cls.getField(fieldName);
                filed.set(this, As(clazz, obj));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public<T extends Serializable> T get(Class<T> clazz, String fieldName) 
        {
            Class<? extends BaseEntity> cls = this.getClass();
            Field filed = null;
            try {
                filed = cls.getField(fieldName);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
            try {
                return As(clazz, filed.get(this));
            } catch (IllegalArgumentException e) {
                Log.i(Tag, "IllegalArgumentException");
            } catch (IllegalAccessException e) {
                Log.i(Tag, "IllegalAccessException");
            }
            catch (Exception e) {
                Log.i(Tag, "Exception");
            }
            return DefaultAs(clazz);
        }
        
        @SuppressWarnings("unchecked")
        private <T> T DefaultAs(Class<T> clazz)
        {
            if(clazz==String.class)
                return (T)" ";
            if(clazz==double.class)
                return (T)"0";
            if(clazz==int.class)
                return (T)"0";
            if(clazz==Date.class)
                return (T)new java.util.Date();
            return null;
        }
        
        @SuppressWarnings("unchecked")
        private <T> T As(Class<T> clazz, Object object) {
            if(clazz==String.class)
            {
                if(object==null) return null;
                return (T)object.toString();
            }
            if(clazz==double.class)
            {
                if(object==null) object=0;
                object= Double.parseDouble(object.toString());
            }
            return (T)object;
        }
    }

    这个类可以不要任何东西,这里我是在项目中用到了部分方法,便于大家调试没有挪掉。接着我们建立一个JsonBuilder的接口,用来提供将json转换为entity或者由entity 转换为json。

    public interface JSONDataBaseBuilder<TEntity extends BaseEntity> {
    
        public abstract ContentValues deconstruct(TEntity entity);
    
        public abstract TEntity jsonBuild(JSONObject jsonObject)
                throws JSONException;
    
        public interface DataBaseBuilder<TEntity extends BaseEntity> extends
                JSONDataBaseBuilder<BaseEntity> {
    
            public abstract TEntity build(Cursor query);
            
            public abstract String table();
            
            public abstract TEntity jsonBuild(JSONObject jsonObject) throws JSONException;
    
        }
    }

    再来提供一个entity将返回的entity或者message进行组合一下:

    public class DBHelperEntity<TEntity extends BaseEntity> {
        public String message;
        public TEntity tEntity;
        public Boolean getIsJsonData()
        {
            if(tEntity==null) return false;
            return true;
        }
        
        public Boolean FormatEntity(String jsonString)
        {
            return true;
        }
    }

    如果我们返回的是list,那么我们也需要一个entity来封装一下:

    public class DBHelperList<TEntity extends BaseEntity> {
        public ArrayList<TEntity> list;
        public String jsonString;
        public String message="";
        public Boolean isURLError = false;
        public DBHelperList(String jsonString)
        {
            this.jsonString = jsonString;
            list = new ArrayList<TEntity>();
        }
        
        public Boolean getIsJSONList()
        {
            if(list!=null && list.size()>0) return true;
            return false;
        }
    }

    最后我们来封装下service类:

    public class JSONServiceBase<TEntity extends BaseEntity> {
        
        private JSONDataBaseBuilder<TEntity> mBuilder;
        private Activity activity;
        
        public JSONServiceBase(Activity activity,JSONDataBaseBuilder<TEntity> builder)
        {
            this.activity = activity;
            mBuilder = builder;
        }
        
        public DBHelperList<TEntity> searchJsonForEntity(String doGetString) {
            String jsonString = doGet(doGetString);
            return new DBHelperList<TEntity>(jsonString);
    //        JSONArray jsonArrayEntry = new JSONArray(jsonString); 
    //        return jsonArrayEntry;
        }
        
        public DBHelperList<TEntity> getJSonList(String doGetString){
            DBHelperList<TEntity> list = searchJsonForEntity(doGetString);
            try {
                 JSONArray jsonArrayEntry = new JSONArray(list.jsonString);
                 list.list = getJSonList(jsonArrayEntry);
                 return list;
            } catch (JSONException e) {
                list.message = list.jsonString;
                return list;
            } 
        }
        
        public DBHelperList<TEntity> getJSonList(String doGetString,Map<String,String> searchMap)
        {
            return getJSonList(ServiceHelper.getPath(searchMap, doGetString));
        }
        
        public ArrayList<TEntity> getJSonList(JSONArray jsonArrayEntities) {
            
          int n = jsonArrayEntities.length();
          ArrayList<TEntity> entities = new ArrayList<TEntity>();
            
            for(int i=0; i < n; i++){
                try {
                    entities.add(mBuilder.jsonBuild(jsonArrayEntities.getJSONObject(i)));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }    
            return entities;
        }
    
        public DBHelperEntity<TEntity> getDbHelperEntity(String doGetString)
        {
            String jsonString = doGet(doGetString);
            JSONObject jObject;
            DBHelperEntity<TEntity> rtnEntity = new DBHelperEntity<TEntity>();
            try {
                try {
                    jObject = new JSONObject(jsonString);
                } catch (JSONException e) {
                    rtnEntity.message = IredeemApplication.getInstance().getString(jsonString);
                    return rtnEntity;
                }
                
                 try {
                    rtnEntity.tEntity = mBuilder.jsonBuild(jObject);
                } catch (JSONException e) {
                    rtnEntity.message = e.getLocalizedMessage();
                }
            } catch (Exception e) {
                rtnEntity.message=e.getMessage();
            }
            
             return rtnEntity;
        }
        
        public DBHelperEntity<TEntity> getDbHelperEntity(String doGetString,Map<String, String> searchMap)
        {
            String jsonString = doGet(ServiceHelper.getPath(searchMap, doGetString));
            JSONObject jObject;
            DBHelperEntity<TEntity> rtnEntity = new DBHelperEntity<TEntity>();
            try {
                try {
                    jObject = new JSONObject(jsonString);
                } catch (JSONException e) {
                    rtnEntity.message = IredeemApplication.getInstance().getString(jsonString);
                    return rtnEntity;
                }
                 try {
                    rtnEntity.tEntity = mBuilder.jsonBuild(jObject);
                } catch (JSONException e) {
                    rtnEntity.message = e.getLocalizedMessage();
                }
            } catch (Exception e) {
                rtnEntity.message=e.getMessage();
            }
             return rtnEntity;
        }
        
        public TEntity SaveJson(String doGetString,TEntity entity)
        {
            return null;
        }    
        
        public List<TEntity> SaveJson(String doGetString,String jsonString)
        {
            return null;
        }
        
        public List<TEntity> SaveJsonList(String doGetString,List<TEntity> list)
        {
            return null;
        }
        
        public List<TEntity> SaveJsonList(String doGetString,String jsonString)
        {
            return null;
        }
        
        private String doGet(String query)
        {
            if(!exists(IredeemApplication.DataInformation.getURL()))
                    return "The web address can't be used!";
            
            return Caller.doGet(IredeemApplication.DataInformation.getJSONServiceURL() + query);
        }
        
        private  boolean exists(String URLName) {
             return URLUtil.isValidUrl(URLName);
        }
    
    }

    这里几个Save方法没有实现,大家有兴趣的话,可以试着用post方法进行封装。

    现在我们要做的就是提供一下数据源以及json跟Entity的具体转换类。

    Entity:

    public  class Staff extends BaseEntity 
    {
        public String CardSN;
        public String StaffName;
        public double MaximumTransaction;
        public Boolean Result;
        public String Message;
        
    }

    Builder:

    public class StaffBuilder implements JSONDataBaseBuilder<Staff> 
    {
    
        @Override
        public ContentValues deconstruct(Staff entity) {
            ContentValues values = new ContentValues();
            values.put("CardSN", entity.CardSN);
            values.put("StaffName", entity.StaffName);
            values.put("MaximumTransaction", entity.MaximumTransaction);
            values.put("Result", entity.Result);
            values.put("Message", entity.Message);
            return values;
        }
    
    
        @Override
        public Staff jsonBuild(JSONObject jsonObject)  {
            Staff entity = new Staff();
            try { 
                  entity.CardSN = jsonObject.getString("CardSN");
                } 
                catch (JSONException e) {
                }
    
            try { 
                  entity.StaffName = jsonObject.getString("StaffName");
                } 
                catch (JSONException e) {
                }
    
            try { 
                  entity.MaximumTransaction = jsonObject.getDouble("MaximumTransaction");
                } 
                catch (JSONException e) {
                    Log.i("StaffBuilder", e.getMessage());
                }
    
            try { 
                  entity.Result = jsonObject.getBoolean("Result");
                } 
                catch (JSONException e) {
                }
    
            try { 
                  entity.Message = jsonObject.getString("Message");
                } 
                catch (JSONException e) {
                }
    
                    
            return entity;
        }
    }

    现在我们准备工作就完成了。最后我们来调用一下:

    获取一个列表。

    public DBHelperList<Staff> getArrayList() {
    
            String url = “www.baidu.com"
            return service.getJSonList(url);
        }

    传入参数:

    public Boolean login(Staff staff, String password) {
            String url = “url”;
            Map<String, String> map = new HashMap<String, String>();
            map.put("StaffId", staff.CardSN);
            map.put("password", password);
            DBHelperEntity<Staff> rtnStaff = service.getDbHelperEntity(url, map);
            if (rtnStaff.getIsJsonData()) {
                MainActivity.getInstance().AddMemberLoginScreen();
                MainActivity.getInstance().RefreshMenu(rtnStaff.tEntity);
                return true;
            }
            return false;
        }

    获得一个实例:

    public DBHelperEntity<Terminal> ConfigureService(String serialNo)
        {
                String url = “Youweb site”;
                Map<String, String> map = new HashMap<String, String>();
                map.put("serialNo", serialNo);            
                return service.getDbHelperEntity(url, map);    
        }

    简单吧。估计有的读者会觉得在写entity和builder的时候会写大量的代码,那我们何不运用T4建立一个模板让它们自动生成。

    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ include file="EF.Utility.CS.ttinclude"#><#@
     output extension=".cs"#><#
    
    CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this, 1);
    MetadataTools ef = new MetadataTools(this);
    
    string inputFile = @"../Model.edmx";
    EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
    string namespaceName = code.VsNamespaceSuggestion();
    
    EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
    WriteHeader(fileManager);
    
    foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
    {
        fileManager.StartNewFile(entity.Name + ".java");
    
    #>
    package com.iredeem.db.api;
    
    import com.iredeem.db.BaseEntity;
    
    <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#> class <#=code.Escape(entity)#> extends BaseEntity <#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
    {
    <#
        
        var propertiesWithDefaultValues = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity && p.DefaultValue != null);
        var collectionNavigationProperties = entity.NavigationProperties.Where(np => np.DeclaringType == entity && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many);
        var complexProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == entity);
        
        if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
        {
    #>
        public <#=code.Escape(entity)#>(){    }
    
    <#
        }
    
        var primitiveProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity);
        if (primitiveProperties.Any())
        {
            foreach (var edmProperty in primitiveProperties)
            {
                if (edmProperty.Name == "Id") continue;
                WriteProperty(code, edmProperty);
            }
        }
    
    
      #>
    }
    <#
        EndNamespace(namespaceName);
    }
    
    foreach (var complex in ItemCollection.GetItems<ComplexType>().OrderBy(e => e.Name))
    {
        fileManager.StartNewFile(complex.Name + ".java");
        BeginNamespace(namespaceName, code);
    #>
    
    
    <#=Accessibility.ForType(complex)#> class <#=code.Escape(complex)#>
    {
    <#
        var complexProperties = complex.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == complex);
        var propertiesWithDefaultValues = complex.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == complex && p.DefaultValue != null);
    #>
       
    }
    <#
        EndNamespace(namespaceName);
    }
    
    if (!VerifyTypesAreCaseInsensitiveUnique(ItemCollection))
    {
        return "";
    }
    
    fileManager.Process();
    
    #>
    <#+
    string GetResourceString(string resourceName)
    {
        if(_resourceManager == null)
        {
            _resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly);
        }
        
        return _resourceManager.GetString(resourceName, null);
    }
    System.Resources.ResourceManager _resourceManager;
    
    void WriteHeader(EntityFrameworkTemplateFileManager fileManager)
    {
        fileManager.StartHeader();
    #>
    //------------------------------------------------------------------------------
    // <auto-generated>
    // <#=GetResourceString("Template_GeneratedCodeCommentLine1")#>
    //
    // <#=GetResourceString("Template_GeneratedCodeCommentLine2")#>
    // <#=GetResourceString("Template_GeneratedCodeCommentLine3")#>
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    <#+
        fileManager.EndBlock();
    }
    
    void BeginNamespace(string namespaceName, CodeGenerationTools code)
    {
            namespaceName = namespaceName;
        CodeRegion region = new CodeRegion(this);
        if (!String.IsNullOrEmpty(namespaceName))
        {
    #>
    namespace <#=code.EscapeNamespace(namespaceName)#>
    {
    <#+
            PushIndent(CodeRegion.GetIndent(1));
        }
    }
    
    
    void EndNamespace(string namespaceName)
    {
        if (!String.IsNullOrEmpty(namespaceName))
        {
            PopIndent();
    #>
    
    <#+
        }
    }
    
    void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
    {
        WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(edmProperty)),
                      code.Escape(edmProperty.TypeUsage),
                      code.Escape(edmProperty),
                      code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                      code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
    }
    
    
    void WriteNavigationProperty(CodeGenerationTools code, NavigationProperty navigationProperty)
    {
        var endType = code.Escape(navigationProperty.ToEndMember.GetEntityType());
        WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)),
                      navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
                      code.Escape(navigationProperty),
                      code.SpaceAfter(Accessibility.ForGetter(navigationProperty)),
                      code.SpaceAfter(Accessibility.ForSetter(navigationProperty)));
    }
    
    void WriteProperty(string accessibility, string type, string name, string getterAccessibility, string setterAccessibility)
    {
    #>
        <#=accessibility#> <#=WriteJavaProperty(type)#> <#=name#>;
    <#+
    }
    
    string WriteJavaProperty(string name)
    {
        switch(name)
        {
            case "string":
            return "String";
            break;
            case "DateTime":
            return "Date";
            break;
            case "bool":
            return "boolean";
            break;
            case "decimal":
            return "float";
            break;
            case "Nullable<System.DateTime>":
            case "System.DateTime":
            return "Date";
            break;
            case "Nullable<int>":
            return "int";
            break;
            case "System.Guid":
            return "String";
            break;
            case "Nullable<double>":
            return "double";
            break;
            case "Nullable<bool>":
            return "Boolean";
            break;
            default:
            return name;
            break;
        }
    }
    
    string PropertyVirtualModifier(string accessibility)
    {
        return accessibility + (accessibility != "private" ? "" : "");
    }
    
    bool VerifyTypesAreCaseInsensitiveUnique(EdmItemCollection itemCollection)
    {
        var alreadySeen = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
        foreach(var type in itemCollection.GetItems<StructuralType>())
        {
            if (!(type is EntityType || type is ComplexType))
            {
                continue;
            }
    
            if (alreadySeen.ContainsKey(type.FullName))
            {
                Error(String.Format(CultureInfo.CurrentCulture, "This template does not support types that differ only by case, the types {0} are not supported", type.FullName));
                return false;
            }
            else
            {
                alreadySeen.Add(type.FullName, true);
            }
        }
    
        return true;
    }
    #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ include file="EF.Utility.CS.ttinclude"#><#@
     output extension=".cs"#><#
    
    CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this, 1);
    MetadataTools ef = new MetadataTools(this);
    
    string inputFile = @"../Model.edmx";
    EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
    string namespaceName = code.VsNamespaceSuggestion();
    
    EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
    WriteHeader(fileManager);
    
    foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
    {
        fileManager.StartNewFile(entity.Name + "Builder.java");
    
    #>
    package com.iredeem.db.builder;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.content.ContentValues;
    
    import com.iredeem.db.JSONDataBaseBuilder;
    import com.iredeem.db.api.<#=code.Escape(entity)#>;
    
    <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>class <#=code.Escape(entity)#>Builder implements JSONDataBaseBuilder<<#=code.Escape(entity)#>> <#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
    {
    <#
        var propertiesWithDefaultValues = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity && p.DefaultValue != null);
        var collectionNavigationProperties = entity.NavigationProperties.Where(np => np.DeclaringType == entity && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many);
        var complexProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == entity);
        
        if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
        {
    #>
        public <#=code.Escape(entity)#>Builder(){    }
    <#
        }
      #>
    
        @Override
        public ContentValues deconstruct(<#=code.Escape(entity)#> entity) {
            ContentValues values = new ContentValues();
            <#
            var primitiveProperties = entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity);
            if (primitiveProperties.Any()){
            foreach (var edmProperty in primitiveProperties){if (edmProperty.Name == "Id") continue;                    
    #>
    values.put("<#=edmProperty.Name#>", entity.<#=edmProperty.Name#>);
            <#}
        }
                    #>
    return values;
        }
    
    
        @Override
        public <#=code.Escape(entity)#> jsonBuild(JSONObject jsonObject)  {
            <#=code.Escape(entity)#> entity = new <#=code.Escape(entity)#>();
            <#
            foreach (var edmProperty in primitiveProperties)
            {            
            #>
    try { 
                  entity.<#=edmProperty.Name#> = jsonObject.<#=WriteJavaProperty(edmProperty,edmProperty.Name)#>("<#=edmProperty.Name#>");
                } 
                catch (JSONException e) {
                }
    
            <#} #>
            
            return entity;
        }
    }
    
    
    
    <#
        EndNamespace(namespaceName);
    }
    
    foreach (var complex in ItemCollection.GetItems<ComplexType>().OrderBy(e => e.Name))
    {
        fileManager.StartNewFile(complex.Name + ".java");
        BeginNamespace(namespaceName, code);
    #>
    
    
    <#=Accessibility.ForType(complex)#> class <#=code.Escape(complex)#>
    {
    <#
        var complexProperties = complex.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == complex);
        var propertiesWithDefaultValues = complex.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == complex && p.DefaultValue != null);
    #>
       
    }
    <#
        EndNamespace(namespaceName);
    }
    
    if (!VerifyTypesAreCaseInsensitiveUnique(ItemCollection))
    {
        return "";
    }
    
    fileManager.Process();
    
    #>
    <#+
    string GetResourceString(string resourceName)
    {
        if(_resourceManager == null)
        {
            _resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly);
        }
        
        return _resourceManager.GetString(resourceName, null);
    }
    System.Resources.ResourceManager _resourceManager;
    
    void WriteHeader(EntityFrameworkTemplateFileManager fileManager)
    {
        fileManager.StartHeader();
    #>
    //------------------------------------------------------------------------------
    // <auto-generated>
    // <#=GetResourceString("Template_GeneratedCodeCommentLine1")#>
    //
    // <#=GetResourceString("Template_GeneratedCodeCommentLine2")#>
    // <#=GetResourceString("Template_GeneratedCodeCommentLine3")#>
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    <#+
        fileManager.EndBlock();
    }
    
    void BeginNamespace(string namespaceName, CodeGenerationTools code)
    {
            namespaceName = namespaceName;
        CodeRegion region = new CodeRegion(this);
        if (!String.IsNullOrEmpty(namespaceName))
        {
    #>
    namespace <#=code.EscapeNamespace(namespaceName)#>
    {
    <#+
            PushIndent(CodeRegion.GetIndent(1));
        }
    }
    
    
    void EndNamespace(string namespaceName)
    {
        if (!String.IsNullOrEmpty(namespaceName))
        {
            PopIndent();
    #>
    
    <#+
        }
    }
    
    string WriteJavaProperty(System.Data.Metadata.Edm.EdmProperty ent,string name)
    {
    CodeGenerationTools code = new CodeGenerationTools(this);
       var typeName = code.Escape(ent.TypeUsage);
       string rtnVal;
        switch(typeName)
        {
            case "string":
            rtnVal= "String";
            break;
            case "DateTime":
            rtnVal= "Date";
            break;
            case "bool":
            rtnVal= "boolean";
            break;
            case "decimal":
            rtnVal= "Long";
            break;
            case "Nullable<System.DateTime>":
            case "System.DateTime":
            rtnVal= "Date";
            break;
            case "Nullable<int>":
            rtnVal= "Int";
            break;
            case "System.Guid":
            rtnVal= "string";
            break;
            case "Nullable<bool>":
            rtnVal="Boolean";
            break;
            case "Nullable<double>":
            rtnVal="Double";
            break;
            default:
            rtnVal= typeName;
            break;
        }
        rtnVal = rtnVal.Substring(0,1).ToUpper()+rtnVal.Substring(1,rtnVal.Length-1);
        return "get"+rtnVal;
    }
    
    string PropertyVirtualModifier(string accessibility)
    {
        return accessibility + (accessibility != "private" ? "" : "");
    }
    
    bool VerifyTypesAreCaseInsensitiveUnique(EdmItemCollection itemCollection)
    {
        var alreadySeen = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
        foreach(var type in itemCollection.GetItems<StructuralType>())
        {
            if (!(type is EntityType || type is ComplexType))
            {
                continue;
            }
    
            if (alreadySeen.ContainsKey(type.FullName))
            {
                Error(String.Format(CultureInfo.CurrentCulture, "This template does not support types that differ only by case, the types {0} are not supported", type.FullName));
                return false;
            }
            else
            {
                alreadySeen.Add(type.FullName, true);
            }
        }
    
        return true;
    }
    
    #>

    当然如果你说我不用保存到web service,而只是保存在sqllite里面,那么你只需要修改的是call.java其他的就完全不用修改了,方便吧。

    到这里对数据保存是不是就不在用过多的去配置了?

  • 相关阅读:
    mybatis判断字符串是否相等采坑记
    acm时加快cin和cout
    算法竞赛中的无穷大和无穷小
    Electron 安装、运行和项目搭建
    在线更新ubuntu 服务器补丁
    Cannot find module 'webpack/lib/RequestShortener'
    npm install --registry=https://registry.npm.taobao.org
    next InitializeSecurityContext failed
    npm安装typescript
    xmall
  • 原文地址:https://www.cnblogs.com/xieshouzhu/p/3159364.html
Copyright © 2011-2022 走看看