【问题标题】:Android - Best way to sync SQLite with MySQL [duplicate]Android - 将 SQLite 与 MySQL 同步的最佳方式 [重复]
【发布时间】:2014-12-29 15:39:48
【问题描述】:

我正在开发一个项目,其中包含记录日常用户数据的网络应用和移动应用。用户可以删除、更新他们的数据,他们可以使用许多设备插入数据。
我打算这样开发:
用户输入他们的数据,然后插入到 SQLite。服务将定期启动(每 5 小时或 sth)以使用时间戳与 MySQL 同步。
我确实在互联网上使用服务和时间戳搜索了一个样本,但我什么也没找到。如果有示例或教程会很棒。
我是 Android 新手,我不知道开发这样的应用程序的最佳方法是什么。提前致谢。

----编辑----
我考虑使用时间戳或同步。哪个更有效?

【问题讨论】:

    标签: android mysql sqlite sync


    【解决方案1】:

    您可以使用 google 的 volley 库或任何替代的 libraries,这取决于您希望如何发送数据,最好的方法是使用 JSON 让您的生活更轻松,从您喜欢与后端同步并使用 volley 将其发送到 JsonObjectRequest 的 sqlite,例如您的请求可能如下所示

    jsonObjectRequest postForm = new JsonObjectRequest(Request.Method.POST, URL, YourJsonData, 
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // here you can get your response.
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // here you can tell there is something went wrong.
            }
        });
    

    您可以添加一个新值,该值指示该值是否已从您的本地数据库同步。例如,假设您有一个名为 student 的表,并且当您的响应返回成功时,该表有三列 ID、NAME 并在上面的代码中同步或者没有。要从数据库中获取数据,您应该执行以下操作。

    public String getStudents() {
        List<Student> students = new ArrayList<Student>();
        String query = "SELECT * FROM student WHERE synced = 0";
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        if (cursor.moveToFirst()) {
            do {
                Student st = new Student();
                st.setId(cursor.getString(cursor.getColumnIndex(ID)));
                st.setName(cursor.getString(cursor.getColumnIndex(NAME)));
                st.setSynced(cursor.getInt(cursor.getColumnIndex(SYNCED)));
                students.add(st);
            } while (cursor.moveToNext());
        }
        db.close();
        return new Gson().toJson(students);
    }
    

    【讨论】:

    • 你应该替换 st.setName(cursor.getString(1));通过 cursor.getString(cursor.getColumnIndex(NAME)) 其中 NAME 是 Sqlite 列的名称。
    • @JuliatzindelToro 正确,感谢提醒。
    • 嘿@k0sh 感谢您的回答,我的问题是,如果我有 5 个表,那么需要从中创建 json 并使用 volley 将其作为 JsonObjectRequest 发送到服务器,然后相应地从服务器获取数据,这会导致性能低下吗?请回复。
    【解决方案2】:

    AFAIK 的主要方法是使用像 http://loopj.com/android-async-http/ 或 volley lije k0sh 这样的库将数据发送到 PHP 脚本,该脚本将管理您的 mysql 数据。 您必须在服务器中编写一个 php(或 java)脚本来接收您的数据(您应该编写一个 REST API)

    要选择你的 HTTP 库,你应该看这里:

    What is the most robust HTTP library for android?

    您应该真正关心如何同步您的数据,因为它可能会耗尽您的电池电量。 在这里,您将了解如何优化更新:

    https://developer.android.com/training/efficient-downloads/index.html

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多