2017-01-15 12 views
1

私はセンサからデータを収集し、それをローカルのSQLiteデータベースに格納するAndroidアプリケーションを作成しています。同期するためのsqliteファイルの分割

私がしたいのは、このデータ(読み込み:アップロード)をバックエンドアプリケーションと同期することです(これはAndroidの同期アダプタを使用しています)。

データは同期処理中に取得できるので、sqliteファイルの最大サイズを700 Kb(実際は関係ありません)と設定するのが妥当であると思うので、同期アダプタはそれらの700 Kbアクティブなファイルを除いたファイル(POST要求経由)。そして、一度sqliteファイルが限界に達すると、私は新しいアクティブsqliteデータベースを作成し、それに書き込むでしょう。

これはどのように実装できますか?おそらく、もっと良い解決策がありますか?

答えて

1
  • 最終的には、「synced_at」フィールドを持つデータベースファイルを1つだけにすることにしました。
  • また、dbに新しいデータを書き込むときにデータを読み取る(同期させる)のにWALを使用しました。
  • MySQLiteHelperクラスはシングルトンパターンを使用して実装されているため、私のケースではメインアクティビティと同期アダプタから同時にデータベースにアクセスできます。
  • サーバーに送信する前にデータを圧縮します(テキストの場合、gzipを使用して5倍の圧縮を実現します)。

データPOJO:

@AllArgsConstructor 
@NoArgsConstructor 
@Builder 
@Getter 
@Setter 
public class Data { 
    private long id; 
    private float a; 
    private float b; 
    private float c; 
    private long timestamp; 
    private long synced_at; 
} 

MySQLiteHelper:

public class MySQLiteHelper extends SQLiteOpenHelper { 

    private static MySQLiteHelper sInstance; 

    public static final String DB_NAME = "db.sqlite"; 
    public static final int DB_VERSION = 1; 
    public static final String TABLE_NAME = "data"; 

    public static synchronized MySQLiteHelper getInstance(Context context) { 
     if (sInstance == null) { 
      sInstance = new MySQLiteHelper(context.getApplicationContext()); 
     } 
     return sInstance; 
    } 

    private MySQLiteHelper(Context context) { 
     super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DB_NAME, 
       null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     String createDbSql = "..."; 
     sqLiteDatabase.execSQL(createDbSql); 
     Log.d("log", "db created"); 
    } 

    @Override 
    public void onOpen(SQLiteDatabase db) { 
     super.onOpen(db); 
     Log.d("log", "db opened"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
     Log.d("log", "db upgraded"); 
    } 
}