【问题标题】:store image to sqlite from url getting fatal exception将图像从 url 存储到 sqlite 出现致命异常
【发布时间】:2014-12-27 09:27:07
【问题描述】:

我试试store image to sqlite from url,如果我的连接没问题,但如果fatal exception 的连接,我使用的是真实设备

12-27 13:28:05.248: E/AndroidRuntime(29456): FATAL EXCEPTION: main
12-27 13:28:05.248: E/AndroidRuntime(29456): java.lang.IllegalArgumentException: the bind value at index 2 is null
12-27 13:28:05.248: E/AndroidRuntime(29456):    at android.database.sqlite.SQLiteProgram.bindBlob(SQLiteProgram.java:259)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at com.dbp.blob.MainActivity.Insert2DB(MainActivity.java:111)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at com.dbp.blob.MainActivity$ak.onPostExecute(MainActivity.java:63)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at com.dbp.blob.MainActivity$ak.onPostExecute(MainActivity.java:1)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at android.os.AsyncTask.finish(AsyncTask.java:417)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at android.os.AsyncTask.access$300(AsyncTask.java:127)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
12-27 13:28:05.248: E/AndroidRuntime(29456):    at android.os.Handler.dispatchMessage(Handler.java:99)

这是代码

package com.dbp.blob;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;

import android.app.Activity;
import android.app.ProgressDialog;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ImageView;

public class MainActivity extends Activity {
    //url
    private String IMAGEURL = "http://api.androidhive.info/json/movies/2.jpg";
    ImageView ivImg;
    //methode
    private byte[] logoImage, ImageBlob;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        new ak().execute();

    }   
        class ak extends AsyncTask<String, String, String>{
             private ProgressDialog pDialog;
            @Override
                protected void onPreExecute() {
                super.onPreExecute();
         ivImg = (ImageView) findViewById(R.id.imageView1);


                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setMessage("Getting Data ...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }
                protected String doInBackground(String... args) {
                    logoImage = getLogoImage(IMAGEURL);

                    // insert into DB


                    return null;
            }
                protected void onPostExecute(String convert){
                    pDialog.dismiss();
                    Insert2DB();
                    // retrieve from DB
                    RetrieveImageFromDB();
                    // Display Image

                    ivImg.setImageBitmap(getImage(ImageBlob));                  

                }

        }


    //ambil logo
    private byte[] getLogoImage(String url) {
        try {
            URL imageUrl = new URL(url);
            URLConnection ucon = imageUrl.openConnection();

            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);

            ByteArrayBuffer baf = new ByteArrayBuffer(500);
            int current = 0;

            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }

            return baf.toByteArray();
        } catch (Exception e) {
            Log.d("ImageManager", "Error: " + e.toString());
        }
        return null;
    }

    //proses insert
    public void Insert2DB() {
        DatabaseHelper dbHelper = new DatabaseHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        String sql = "INSERT INTO PICTURES (pic_name,picture) VALUES(?,?)";
        SQLiteStatement insertStmt = db.compileStatement(sql);
        insertStmt.clearBindings();
        insertStmt.bindString(1, "Image");
        insertStmt.bindBlob(2, logoImage);
        insertStmt.executeInsert();
        db.close();
    }

    //proses display

    private void RetrieveImageFromDB() {
        DatabaseHelper dbHelper = new DatabaseHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "SELECT * FROM PICTURES";
        Cursor cursor = db.rawQuery(sql, new String[] {});

        if (cursor.moveToFirst()) {
            @SuppressWarnings("unused")
            String strName;
            strName = cursor.getString(1);

            //inisialisasi image
            ImageBlob = cursor.getBlob(2);
        }
        cursor.close();
        db.close();
    }

    //decode
    public static Bitmap getImage(byte[] image) {
        return BitmapFactory.decodeByteArray(image, 0, image.length);
    }

}

【问题讨论】:

  • 任何异常登录getLogoImage ?

标签: android eclipse sqlite android-asynctask


【解决方案1】:
Insert and retrieve ur image in doInBackground 

protected String doInBackground(String... args) {
                    logoImage = getLogoImage(IMAGEURL);

                    // insert into DB
                     Insert2DB();
                   // retrieve from DB
                    RetrieveImageFromDB();
                    return null;
}
     protected void onPostExecute(String convert){
                    pDialog.dismiss();


                    // Display Image

                    ivImg.setImageBitmap(getImage(ImageBlob));                  

                }
        }

【讨论】:

  • 如果我是你,我会稍微格式化一下这个答案。 :) 事实上,它不是很可读。
  • 谢谢,但仍然是致命异常
  • 必须检查 Blob 类型的 DatabaseHelper 类 InsertDB()。 logoimage 也需要检查,值为 null。
猜你喜欢
  • 2015-02-28
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多