如何将Android SQLite中的BLOB数据上传到MySQL BLOB?

3
我正在开发一个项目,用户将一些信息和图像存储到SQLite数据库中。 图像作为BLOB数据存储。现在我想将所有数据上传到我的MySQL数据库。 我正在使用Volley通过调用Web API的AsyncTask逐行上传SQLite中的所有行到MySQL服务器。
不带图像BLOB数据时,一切正常。我不知道是否有办法使用Volley上传blob数据。 我在StackOverflow上搜索了很多但没有得到任何解决方案,请帮助我。
以下是我的函数调用示例:
/**
 * function to upload data into server
 * */
private void SyncTaskDoInBack(final dataDB data) {
    // Tag used to cancel the request
    String tag_string_req = "Inserting Online";

    StringRequest strReq = new StringRequest(Method.POST, AppConfig.API_LINK, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            try {
                JSONObject jObj = new JSONObject(response);
                boolean error = jObj.getBoolean("error");

                // Check for error node in json
                if (!error) {
                    Log.d(TAG, "Success");
                } else {
                    // Error in found
                    String errorMsg = jObj.getString("error_msg");
                }
            } catch (JSONException e) {
                // JSON error
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error: " + error.getMessage());
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting parameters to login url
            Map<String, String> params = new HashMap<String, String>();
            params.put("ID", data._id);
            params.put("PersonName", data.pName);
            params.put("Photo", data.photo.toString());

            return params;
        }

    };

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

我的"dataDB"类如下:

public class dataDB implements Comparable<dataDB>{

    String _id = null;
    String pName = null;
    byte[] photo = null;

    @Override
    public int compareTo(dataDB o) {
        //return title.toLowerCase().compareTo(o.title.toLowerCase());
        return 0;
    }

}

List Data Model类定义如下:

public class ListDataModel {

private int _id;
private String name;
private byte[] image;

public ListDataModel() { }

public ListDataModel(String name, String thumbnailUrl) {
    this.name = name;
    this.thumbnailUrl = thumbnailUrl;
}

// getting ID
public int getID() {
    return this._id;
}

// setting id
public void setID(int keyId) {
    this._id = keyId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public byte[] getImage() {
    return this.image;
}

public void setImage(byte[] image) {
    this.image = image;
}

}
1个回答

1
在 StackOverflow 上进行了大量搜索后,我找到了以下公式,似乎可以将相机图像转换为 Base64 字符串,反之亦然。希望这能帮到其他人。
我正在使用 Apache Commons Codec 进行 Base64 编码/解码,可以从这里 http://commons.apache.org/proper/commons-codec/ 获取(我认为也可以使用 Android 默认的 Base64 类,但我还用它做其他用途)。
这是我的 onActivityResult 函数。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK)
        return;

    switch (requestCode) {

        case CAMERA_REQUEST:

            Bundle extras = data.getExtras();

            if (extras != null) {

                Bitmap myImage = extras.getParcelable("data");

                ByteArrayOutputStream bao = new ByteArrayOutputStream();
                myImage.compress(Bitmap.CompressFormat.JPEG, 90, bao);

                imageInByte = bao.toByteArray();

                imageInBase64Str = Base64.encodeBytes(imageInByte); // using internal class
            }

            break;
    }
}

然后我将Base64字符串imageInBase64Str传递给我的SQlite和MySQL在线数据库的插入语句。

当从SQLite或MySQL获取图像Base64编码数据以查看时,我会按以下方式处理我的图像:

 try {
        byte[] decodedByte = Base64.decode(imageData, 0);
        theImage = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
 }catch (IOException io){
        Log.d("ViewRecord",io.getMessage());
 }

就是这样 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接