【问题标题】:Is there a simpler way to transfer data between an android application and a server database?有没有更简单的方法在 android 应用程序和服务器数据库之间传输数据?
【发布时间】:2014-02-03 14:37:17
【问题描述】:

目前,在我的应用程序中,我目前有一个 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;
    }

它创建一个容器的对象,然后遍历容器中的每个事物,并在 SQL 数据库中运行一个存储过程,将它们添加到数据库中,并为每个事物返回一个结果(无论成功与否)。然后,它返回一个包含这些结果的数组,并告诉应用程序每个结果都向用户指示它们是否成功。

添加新内容,甚至使用此系统更改内容非常烦人,因为它必须在多个地方进行更改。

我想知道是否有什么我可以实现的东西来让这件事变得更简单、更快捷,或者是否有多余的东西可以被其他东西代替。

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

我使用带有 .NET 框架的 C# 作为我的 Web 服务 API,使用 SQL Server 10.50.1600 作为我的 SQL 数据库,使用带有 2.3.3 的 android 作为我的设备的最低平台,所以这些是我的限制,并且是不灵活改变。当然,如果它们兼容,任何外部库都是受欢迎的。

如果您希望我包含更多我的代码,请随时提出。它将成为我工作的公司的商业代码,所以我不能透露整个来源,但我愿意尽可能多地展示(如果有意义的话)。

非常感谢您阅读和帮助我!

*编辑:*凹凸。

【问题讨论】:

    标签: c# android sql sql-server json


    【解决方案1】:

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

    【讨论】:

    • 数据库的东西更是如此,我遇到了冗余问题。我必须在大约 6 或 7 个地方添加它,只是为了添加一个新属性或更改一个。我让它添加到数据库、服务对象、存储过程、android db 和 android 对象。我看不出它会如何简化它,因为我已经解决了 Gson 库的序列化问题。
    • 哦,这更有意义。好吧,如果您遇到一个为您完成所有这些工作的库,那将是开发团队的终结,哈哈。
    • 或者,您可以添加 ormlite.com/sqlite_java_android_orm.shtml 以删除一些所需的更新
    • 我很想遇到它=P。本质上,我想实现它而不是为它找到一个库。以类似的方式实现它,所以我只需要一个所有对象及其属性的列表,如果我添加一个,则为每个位置指定它的类型(sqlite 中的文本,sql 中的 nvarchar,C# 中的字符串和Java),然后它可以传递指令来添加它们。尽管这意味着使 DB 的设计和对象形成动态化。这可能吗?
    • @DamianWalczak 我做了一堆序列化来减少它。在服务器端,一切都一样。将字段放在数据库中,创建类和存储过程以获取它们。在客户端,我已经减少了很多。通过将 json 序列化为 contentvalues,列名与对象变量和 json 字段匹配,我已经摆脱了接收/放入 SQLite DB 的操作。然后我将光标反序列化为对象。制作这些反序列化器并不难。它还鼓励减少命名错误,因为如果命名错误会引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2014-03-18
    • 2011-01-17
    • 2021-10-03
    • 2013-11-19
    相关资源
    最近更新 更多