Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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
C# 有没有更简单的方法在android应用程序和服务器数据库之间传输数据?_C#_Android_Sql_Sql Server_Json - Fatal编程技术网

C# 有没有更简单的方法在android应用程序和服务器数据库之间传输数据?

C# 有没有更简单的方法在android应用程序和服务器数据库之间传输数据?,c#,android,sql,sql-server,json,C#,Android,Sql,Sql Server,Json,目前,在我的应用程序中,我目前有一个SQLite数据库,用于存储最终需要发送到数据库或稍后在应用程序中调用(或两者)的相关信息。这是使用SQLiteOpenHelper类以传统方式完成的: public class SQLiteHelper extends SQLiteOpenHelper { // define constants to store names of each table and each field name // Tables public static final

目前,在我的应用程序中,我目前有一个SQLite数据库,用于存储最终需要发送到数据库或稍后在应用程序中调用(或两者)的相关信息。这是使用SQLiteOpenHelper类以传统方式完成的:

public class SQLiteHelper extends SQLiteOpenHelper {

// define constants to store names of each table and each field name

// Tables

public static final String TABLE_VISIT_DETAILS = "VisitDetails";
...
private static final String DATABASE_NAME = "Projects.db";
private static final int DATABASE_VERSION = 41;

// Database table creation sql statements, SQLite requires tables to be
// created in separate statements

private static final String CREATE_TABLE_VISIT_DETAILS = "create table "
        + TABLE_VISIT_DETAILS + "(" + COLUMN_ID
        + " integer primary key autoincrement, " + COLUMN_PROJECT_NUMBER
        + " text not null, " + COLUMN_SITE_VISIT_ID + " integer, "
        + COLUMN_SCHEDULED_START_TIME + " integer, "
        + COLUMN_SCHEDULED_END_TIME + " integer, " + COLUMN_POSTCODE
        + " text, " + COLUMN_SUBMITTED + " text, " + COLUMN_SITE_NAME
        + " text, " + COLUMN_SITE_ADDRESS + " text, " + COLUMN_PROJECT_TYPE
        + " text, " + COLUMN_CLIENT + " text, "
        + COLUMN_REINSPECTION_PROJECT + " text, " + COLUMN_VISIT_NUMBER
        + " integer);";
...
etc
我只是简单地存储对象。以前,我使用JSONObject和JSONArray将JSON请求发送到服务器,但现在我将其更改为Gson,以便更容易地使用序列化,并且需要将每个属性的put方法用于JSON对象

我在服务器上设置了一个API,它等待这些json对象,然后对其进行解析,例如:

[WebInvoke(UriTemplate = "UploadSurveyData/{token}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
    public List<UploadProjectContainerResult> UploadSurveyData(string token, UploadProjectContainer data)
    {
        List<UploadProjectContainerResult> results = new List<UploadProjectContainerResult>();
        MobileAssessorAuthenticationResults authResult = ValidateToken(new Guid(token));

        SqlCommand command = null;
        SqlDataReader reader = null;

        if (authResult == MobileAssessorAuthenticationResults.Success)
        {
            results.Add(uploadQuestionnaireResponse(token, data.questionnaireResponses));
            results.Add(uploadBuildings(token, data.buildings));
            results.Add(uploadFloors(token,data.floors ));
            results.Add(uploadLocations(token, data.locations));

            String projectDir = "";
            command = new SqlCommand("[dbo].[GetProjectDir]", _connector.Connection);
            command.CommandType = System.Data.CommandType.StoredProcedure;

            command.Parameters.AddWithValue("@projectNo", data.siteInfo.projectNo);

            reader = command.ExecuteReader();

            if (reader.HasRows)
            {
                reader.Read();
                projectDir = reader.GetString(0);
            }

            results.Add(uploadSiteInfo(token, data.siteInfo, projectDir));                        
            results.Add(uploadSubmission(token,data.submission, projectDir, data.scheduleId));
        }

        return results;
    }
[WebInvoke(UriTemplate=“UploadSurveyData/{token}”,Method=“POST”,ResponseFormat=WebMessageFormat.Json)]
公共列表UploadSurveyData(字符串标记,UploadProjectContainer数据)
{
列表结果=新列表();
MobileAssessorAuthenticationResults authResult=ValidateToken(新Guid(令牌));
SqlCommand=null;
SqlDataReader=null;
if(authResult==MobileAssessorAuthenticationResults.Success)
{
添加(上传QuestionnaireResponse(令牌、数据、questionnaireResponses));
添加(上传建筑物(令牌、数据、建筑物));
添加(上传楼层(token,data.floors));
添加(上传位置(令牌、数据、位置));
字符串projectDir=“”;
command=newsqlcommand(“[dbo].[GetProjectDir]”,_connector.Connection);
command.CommandType=System.Data.CommandType.StoredProcess;
command.Parameters.AddWithValue(“@projectNo”,data.siteInfo.projectNo);
reader=command.ExecuteReader();
if(reader.HasRows)
{
reader.Read();
projectDir=reader.GetString(0);
}
添加(uploadSiteInfo(token、data.siteInfo、projectDir));
Add(uploadSubmission(token、data.submission、projectDir、data.scheduleId));
}
返回结果;
}
它为容器创建一个对象,然后遍历容器中的每一个对象,在SQL数据库中运行一个存储过程,将它们添加到数据库中,并为每个对象返回一个结果(无论是否成功)。然后,它返回这些结果的数组,并告诉应用程序每个结果都向用户指示它们是否成功

使用这个系统添加新的东西,甚至更改东西都是很烦人的,因为它必须在几个地方进行更改

我想知道是否有什么我可以实现,使这一点更简单,更快地做,或者如果有任何它是多余的,可以由其他东西取代

总的来说,我只想为这个项目和未来的项目大大减少整个过程。我不介意从头开始,即使只是为了以后提高生产力

我使用C#with.NET framework作为我的Web服务API,SQL Server 10.50.1600作为我的SQL数据库,android with 2.3.3作为我的设备最低平台,因此这些都是我的局限性,是无法灵活改变的。当然,如果兼容,欢迎使用任何外部库

如果您想让我包含更多的代码,请随时询问。它将成为我工作的公司的商业代码,因此我无法披露全部源代码,但我愿意显示所需的内容(如果有意义的话)

非常感谢您的阅读和帮助


*编辑:*Bump。

传输对象图,并附带自己的序列化库。就客户机/服务器网络而言,实现起来非常简单和快速。关于代码的重构,您可能处于最好的位置来提取冗余部分

更重要的是数据库,我有冗余的问题。我必须在大约6或7个位置添加它,只是为了添加一个新属性或更改一个属性。我让它将其添加到数据库、服务对象、存储过程、android数据库和android对象中。我看不出它会如何简化它,因为我已经用Gson库解决了序列化问题。哦,这更有意义。好吧,如果你遇到一个为你做所有这些的库,那将是开发团队的末日lol。或者,你可以添加或删除一些更新要求。我很想遇到它=P。本质上,我想实现它,而不是为它找到一个库。以类似的方式实现它,所以我只需要一个包含所有对象及其属性的列表,如果我添加了一个,则为每个位置指定它的类型(sqlite中的文本、sql中的nvarchar、C#和Java中的字符串),然后它就可以提供添加它们的指令。尽管这意味着DBs的设计和目标形成是动态的。这有可能吗?@DamianWalczak我做了一系列的序列化来减少它。在服务器端,一切都是一样的。将字段放入数据库中,创建类和存储过程以获取它们。在客户端,我已经减少了很多。通过将json序列化为contentvalues,使列名与对象变量和json字段匹配,我摆脱了接收/放入SQLite DB的任务。然后我将光标反序列化到对象中。制作这些反序列化器并不难。它还鼓励在命名时减少错误,因为如果命名错误,它将抛出一个错误。