拆分sqlite文件以进行同步

时间:2017-01-15 10:42:46

标签: android sqlite split http-post android-syncadapter

我正在编写一个Android应用程序,它从传感器收集数据并将其存储在本地SQLite数据库中。

我想要做的是将此数据(读取:上传)与后端应用程序同步(我正在使用Android&#39的同步适配器)。

由于可以在同步过程中获取数据,我认为将sqlite文件的最大大小设置为700 Kb(并不重要)是合理的,因此同步适配器将同步这些700 Kb文件(通过POST请求),不包括活动文件。一旦sqlite文件达到限制,我将创建一个新的活动sqlite db并写入它。

如何实施?也许,有一个更好的解决方案?

1 个答案:

答案 0 :(得分:1)

  • 最终我决定只有一个带有'synced_at'字段的数据库文件。
  • 在将新数据写入db时,我还使用WAL来读取数据(要同步)。
  • MySQLiteHelper类是使用Singleton模式实现的,因此您可以从Main活动和Sync适配器同时访问您的db。
  • 我还会在将数据发送到服务器之前对其进行压缩(对于使用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");
    }
}