【问题标题】:Send ROOM Database List Data in Body in Array through Retrofit Android通过 Retrofit Android 以数组形式发送 ROOM 数据库列表数据
【发布时间】:2020-09-01 06:58:12
【问题描述】:

我想通过 Retrofit 在 Body 中发送 Room Database 保存的数据。我将数据保存在 Room 的列表中,并将通过 Retrofit Networking Library 在正文中发送相同的数据。下面是相同的代码。

房间桌类

@Entity(tableName = "cash")
public class Cash implements Serializable {
@PrimaryKey(autoGenerate = true)
private int id;
@SerializedName("UserID")
@ColumnInfo(name = "UserID")
private String UserID;
@SerializedName("FareAmount")
@ColumnInfo(name = "FareAmount")
private String FareAmount;
@SerializedName("TransactionId")
@ColumnInfo(name = "TransactionId")
private String TransactionId;

public String getTransactionId() {
    return TransactionId;
}

public void setTransactionId(String transactionId) {
    TransactionId = transactionId;
}
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getUserID() {
    return UserID;
}

public void setUserID(String userID) {
    UserID = userID;
}
public String getFareAmount() {
    return FareAmount;
}

public void setFareAmount(String fareAmount) {
    FareAmount = fareAmount;
}

道接口

@Dao
public interface CashDao {

@Query("Select * from cash ORDER BY id ASC")
List<Cash> getCashList();
@Insert
void insertCash(Cash cash);
@Update
void updateCash(Cash cash);
@Delete
void deleteCash(Cash cash);

@Query("DELETE FROM cash")
void deleteAll();

}

事务数据库类

@Database(entities = {Cash.class}, exportSchema = false, version = 3)
public abstract class TransactionDatabase extends RoomDatabase {

private static final String DB_NAME = "transaction_db";
private static TransactionDatabase instance;

public static synchronized TransactionDatabase getInstance(Context context){
    if (instance == null){
        instance = 
Room.databaseBuilder(context.getApplicationContext(),TransactionDatabase.class,DB_NAME)
                .fallbackToDestructiveMigration()
                .allowMainThreadQueries()
                .build();
    }
    return instance;
}

public abstract CashDao cashDao();
}

主活动

btn_save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            cash = new Cash(str_userId, str_fareAmount,str_transactionId);
            appDB.cashDao().insertCash(cash);
            }
    });

   btn_upload.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        
        List<Cash> cashlist = appDB.cashDao().getCashList();
        if(cashlist.size() == 0){
            Toast.makeText(MainActivity.this,"Data is already uploaded!",Toast.LENGTH_SHORT).show();
        } else {
        // upload data code here
        }
        appDB.cashDao().deleteAll();
    }
});


public interface AppServiceAPI{

@POST("/Api/OfflineCashTransaction")
Call<ServiceOfflineAPI> cashtxn(@Body Cash cash);
}

我想在 body json 中发送数据,类型将通过 Retrofit 如下所示。

[{
"UserId":"Test",
"FareAmount":"65",
"TransactionId":202008281139
},{
"UserId":"Test",
"FareAmount":"95",
"TransactionId":202008281140
},{
"UserId":"Test",
"FareAmount":"195",
"TransactionId":202008281156
}]

响应如下:

 {
"Status": true,
"Error": "",
"Message": "3 : Transaction  successfully Saved!!.",
"Data": ""
}

【问题讨论】:

  • 这个问题的具体内容是什么?您可以使用 Retrofit 将数据作为 JsonObject 类型的参数简单地发送。网上有很多关于它的说明。 stackoverflow.com/questions/40435098/…
  • @Sajjad 你分享的链接只有问题但没有好的答案,除此之外我想在正文中发送房间数据库数据。那么我会将数据放入 Retrofit Call 中。

标签: android retrofit android-room


【解决方案1】:

这是一个相当广泛的问题。一个很好的做法是将其分解为更简单/更小的问题,并尝试一个一个地解决它们。

还是用下面的方法获取JsonObject:

public JsonObject listToJson(ArrayList<Object> objects) {
    JsonArray jsonArray = new Gson().toJsonTree(objects).getAsJsonArray();
    JsonObject obj = new JsonObject();
    obj.add("my_custom_key", jsonArray);
    return obj;
}

要使用 Retrofit,您需要这样的 API 接口:

 public interface APIInterface {
    @POST("your_sub_url")
    Call<Response<YourResponsePOJO>> sendData(@Header("Content-Type") String contentType, @Body JsonObject body);
}

这将是您的改造客户端类:

public class RetrofitClientInstance {
private static Retrofit retrofit;
private static final String BASE_URL = "your_base_url";
public static Retrofit getRetrofitInstance() {
    if (retrofit == null) {
        retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

}

这是您期望从服务器得到的 POJO 响应:

public class MyExpectedResponse<T> {
    @SerializedName("errorCode")
    public int errorCode;
    @SerializedName("errorMessage")
    public String errorMsg;
    @SerializedName("response")
    public T response;

    //setter getter methods
}

最后调用 API:

 public void sendData (JsonObject paramsFromRoom) {
    APIInterface apiService =
            RetrofitClientInstance.getRetrofitInstance().create(APIInterface.class);
    Call<MyExpectedResponse<Void>> call = apiService.sendData("application/json", paramsFromRoom);
    call.enqueue(new Callback<MyExpectedResponse<Void>>() {
        @Override
        public void onResponse(Call<MyExpectedResponse<Void>> call, MyExpectedResponse<Void> response) {
            
        }

        @Override
        public void onFailure(Call<MyExpectedResponse<Void>> call, Throwable t) {
            
        }
    });
}

【讨论】:

  • 为什么是“my_custom_key”以及您在哪里转换 JsonObject “paramsFromRoom”
  • JsonObject 中的每个条目都有一个名称。所以用你想要的名字替换my_custom_key(服务器应该知道这个名字,这样它就可以解析JsonObject
  • 您在哪里转换了“paramsFromRoom”?从第一种方法listToJson.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多