前面写了一篇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 + "\n");
}
} 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其他的就完全不用修改了,方便吧。

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

Android 与 Webservice 的快速保存的更多相关文章

  1. 黎活明8天快速掌握android视频教程--12_文件的保存与读取

    1.当前是把文件保存当前手机的app的data目录下 我们来看看操作保存文件的业务类 package contract.test.savafileapplication; import android ...

  2. Android平台调用WebService详解

    上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用中调用Web Service.本文将通过 ...

  3. 网摘Android调用WebService

    这边特别注意调用的.net WCF 接口的绑定方式.以前一直用的wxHttpbinding,一直连不上.改成BasicHTTPbinding就能连上了 上篇文章已经对Web Service及其相关知识 ...

  4. Android调用WebService(转)

    Android调用WebService WebService是一种基于SOAP协议的远程调用标准,通过 webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SD ...

  5. android loginDemo +WebService用户登录验证

        android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...

  6. 解决android开发webservice的发布与数据库连接的问题

    由于app后续开发的需要,移植了两次webservice和数据库,遇到了不少问题,也花费了很多时间,实践告诉我要学会寻找问题的根源,这样才能在开发中节省时间,尽快解决问题!好,废话不多说,转入正题…… ...

  7. Android GIS +webservice

    Android新手经典入门教程 Android开发教程(完全免费版) Android SDK v3.1.0 Android定位功能(一) Android定位功能(二) Android 百度地图开发(一 ...

  8. 如何解析android访问webservice返回的SoapObject数据(可用)

    怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...

  9. 纠正网上乱传的android调用Webservice方法。

    1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦,所以笔者决定将自己整理好的能用的android调用webser ...

随机推荐

  1. WPF 之 文本框及密码框添加水印效果

    1.文本框添加水印效果 文本框水印相对简单,不需要重写模板,仅仅需要一个 VisualBrush 和触发器验证一下Text是否为空即可. <TextBox Name="txtSerac ...

  2. 1.7.6 Highlighting-高亮

    1 高亮 solr的高亮允许匹配用户查询的文档的片段包含在查询响应中返回,高亮包含在返回结果的单独部分(highlighting部分). solr提供了一个高亮工具的集合,这个工具允许控制大量字段的片 ...

  3. recent.css常用的页面初始化样式

    <style> @charset "utf-8"; body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form ...

  4. 【Linux/Ubuntu学习6】unbuntu 下载android源码

    在Windows下安装Cygwin,通过Cygwin也可在Windows里通过本文的下载步骤下载Android源码. 以下为在Ubuntu下下载Google Android4.4源码的步骤: 1. 安 ...

  5. java执行程序

    执行jar java -jar x.jar 执行jar里边指定class java -cp x.jar x.x.x

  6. 3D--知识点1

    三层架构 1.DAL(数据访问层)-->与数据库进行关联,对数据库进行增删改查操作2.BLL(业务逻辑层)-->负责加减乘除与或非操作,比如:用户注册3.UI/web(表示层) sqlse ...

  7. javascript-函数的参数和return语句

    × 目录 [1]参数 [2]Arguments对象 [3]函数重载 [4]return 语句 ------------------------------------- 一.参数(最多25个) 可以动 ...

  8. 移动端1px细线的处理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象

    AmysqlProcess类,框架的总进程对象 ./Amysql/Amysql.php 下面还是和以前一样,先上代码~ class AmysqlProcess { public $AmysqlCont ...

  10. Table of Contents - TCP/IP

    网络访问层 Ethernet II 网际层 IP IPv4 报文格式 ICMP ICMP 报文分析 ping: 向网络主机发送 ICMP ECHO_REQUEST 包 ARP ARP 过程 arp 命 ...