2016-10-03 9 views
0

私はGPS座標とその情報の全部(50K行)mysqlデータベースサーバーのデータをAndroid携帯にjson(13.8 MB)で初めて送信しようとしています。アプリ、私は非常に多くの主要な問題だ!、私はPHPのyii2コン​​トローラからJSONデータを送信するために使用php mysqlサーバーからJava androidクライアントに大きなJSONデータをロード

コードは次のとおりです。

public function actionGetGPS(){ 
     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
     Yii::$app->response->data["success"] = true; 
     Yii::$app->response->data["gps"] = \app\models\gps::findAll(); 
} 

とAndroidの一部、AsyncTaskでJSONファイルを取得するには、私が使用しましたこのコード:

public static class getGpsDataForFirstTimeRun extends AsyncTask<String, String, JSONObject> { 
    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected JSONObject doInBackground(String... args) { 
     try { 
      HashMap<String, String> params = new HashMap<>(); 
      // App.URL_GET_GPS = "http://localhost/myproject/web/gps/get-gps" 
      JSONObject jsonObject = JSONParser.MakeHttpRequest(App.URL_GET_Gps, "POST", params); 
      if (jsonObject != null) { 
       try { 
        if (jsonObject.getBoolean(App.TAG_SUCCESS)) { 
         App.Log("Saving Json Data"); 

         JSONArray jsonArray = jsonObject.getJSONArray("Gps"); 

         for (int i = 0; i < (jsonArray.length()); i++) { 
          JSONObject jObject = (JSONObject)jsonArray.get(i); 

          // App.db = new DBHelper(); 
          App.db.addGps(jObject.getInt("id"), jObject.getInt("city_id"), jObject.getDouble("latitude"), jObject.getDouble("longitude")); 
          App.Log("Inserted: "+jObject.toString()); 
         } 

         App.Log("Json Data Saved"); 
        } 
       } 
       catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonObject) {} 
} 

とdbhelperに私はGPSを追加するため、この機能を持っている:

public void addGps(int Gps_id, int city, double latitude, double longitude) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(GPS_COLUMN_ID, Gps_id); 
    values.put(GPS_COLUMN_CITY_ID, city); 
    values.put(GPS_COLUMN_LATITUDE, latitude); 
    values.put(GPS_COLUMN_LONGITUDE, longitude); 
    db.insert(GPS_TABLE_NAME, null, values); 
    //db.close(); // Closing database connection // Updated Question 
    App.Log("New Gps inserted into SQLite: " + Gps_id); 
} 

問題1:PHPサーバのメモリ:私は、この行のコードを使用して、それは無制限作っ:134217728バイトの許可メモリサイズは

ソリューション1を使い果たし:

ini_set('memory_limit', '-1'); 

問題2:私が見つけた、それは全く実用的ではない、あなたは千のユーザーを持っている場合、サーバはチョークかもしれません。しかしながら

解決策2:私が見つけた唯一の方法は、24時間に1回データを取得し、それをサーバー上のjsonファイルに置くことです。データベース内で変更された場合、更新するクエリを実行します。ユーザーは新しくアプリケーションをダウンロードしたときに最新のデータを取得し、古いユーザーは小さな変更であるためデータベースから新しいデータをダウンロードできます。

私の質問はここです:このアプローチは良いですか?それとももっと良いですか?

問題3:

10-03 17:47:39.381 702-702/com.myproject.gps E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.myproject.gps, PID: 702 
    java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 
     at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:1027) 
     at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:742) 
     at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:397) 
     at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:905) 
     at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834) 
     at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
     at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147) 
     at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:136) 
     at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197) 
     at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237) 
     at com.myproject.gps.Tools.Instance.DBHelper.getGps(DBHelper.java:337) 
     at com.myproject.gps.Dashboard.GPSMapFragment.onCameraIdle(GPSMapFragment.java:119) 
     at com.google.android.gms.maps.GoogleMap$21.onCameraIdle(Unknown Source) 
     at com.google.android.gms.maps.internal.zzf$zza.onTransact(Unknown Source) 
     at android.os.Binder.transact(Binder.java:380) 
     at uv.a(:com.google.android.gms.DynamiteModulesB:79) 
     at maps.ad.j.b(Unknown Source) 
     at maps.ad.j.a(Unknown Source) 
     at maps.ad.j$2.run(Unknown Source) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:145) 
     at android.app.ActivityThread.main(ActivityThread.java:5951) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

解決策3::(50KデータはSQLiteのために挿入されていないアンドロイドの部分は、私はこのエラーを得た私は、JSONファイルを入れてみました:私はそれをダウンロードしたかのように、資産フォルダに、そこからJSONデータを挿入しようとした:それは働いたが

問題4:!それはsqliteのに50,000 JSONデータを挿入するために15分のようにかかったの..

はまだのための解決策を見つけられませんでしたこれ!、任意の提案やコメントは評価されるだろう..

+1

挿入するたびにsqlite DBを閉じるのはなぜですか?それは店に運転して食料品を買ったり、家に帰ったり、冷蔵庫に入れたり、店に戻ったり、パンを買ったり、家を運転したりして食料品を買うようなものです。 –

+0

うわー!、私はこれについて考えなかった..それを試してみましょう:) –

+1

1.いくつかのJSONストリーミングAPIを使用して..2。トランザクション3を使用してください。synchro-fx最後の変更タイムスタンプを行に追加し、ダウンロードからダウンロードした行のみをダウンロードします。要求よりもtimeptampが大きい... – Selvin

答えて

2

GPSデータの一部をダウンロードすることは可能ですか?最初のインストールでは、ユーザーに最も近い座標を10000行だけにすることができます。次に、残りのデータ更新をスケジュールに従ってバックグラウンドで実行できます。

+0

私は既にこれをやっています、これはある都市のみです。もし私が全国のためにダウンロードしたいのなら、それは400,000でしょう:( –

関連する問題