2013-07-05 118 views
2

我在將圖像從url插入到sqlite數據庫時出現問題。將圖像從URL保存到SQLITE數據庫

public class MainActivity extends Activity { 
     protected SQLiteDatabase sqlitedatabase_obj; 
     DataBaseHelper databasehlpr_obj; 
     int accId; 
     byte[] accImage; 

     byte[] logoImage; 
     byte[] photo; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      AndroidContext.setContext(this); 
      sqlitedatabase_obj = DataBaseHelper.getInstance().getDb(); 
      sqlitedatabase_obj.delete(DataBaseHelper.IMG_table, null, null); 
      logoImage = getLogoImage("http://images.bestbuy.com/images/small_137385013870957.jpg"); 
      insertUser(); 


     } 

     private byte[] getLogoImage(String url) { 
      try { 
       URL imageUrl = new URL(url); 
       URLConnection ucon = imageUrl.openConnection(); 
       System.out.println("11111"); 
       InputStream is = ucon.getInputStream(); 
       System.out.println("12121"); 

       BufferedInputStream bis = new BufferedInputStream(is); 
       System.out.println("22222"); 

       ByteArrayBuffer baf = new ByteArrayBuffer(500); 
       int current = 0; 
       System.out.println("23333"); 

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

       } 
       photo = baf.toByteArray(); 
       System.out.println("photo length" + photo); 


      } catch (Exception e) { 
      Log.d("ImageManager", "Error: " + e.toString()); 
      } 
      return accImage; 
    } 
    public void insertUser() { 
      ContentValues userdetailValues = new ContentValues(); 
      userdetailValues.put("account_image", photo); 
      sqlitedatabase_obj.insert(DataBaseHelper.IMG_table, null, userdetailValues); 
    } 
} 

我創建一個數據庫,如下─

final String[] creatStatments = new String[]{"create table " 
      + IMG_table 
      + "(account_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,"+" account_image BLOB NOT NULL)", 

所有上面的代碼從URL保存圖像中的SQLite數據庫。但我得到一個異常,如下

Error: java.net.UnknownHostException: images.100bestbuy.com 
Error inserting account_image=null 
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
    at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
    at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61) 
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1582) 
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426) 
    at com.example.urltodatabase.MainActivity.insertUser(MainActivity.java:75) 
    at com.example.urltodatabase.MainActivity.onCreate(MainActivity.java:39) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 

當我去地找哪裏的問題,然後我發現,問題出在

InputStream is = ucon.getInputStream(); 

所以,請有人幫我出這個問題。我真的很高興爲我的圖標解決努力。提前感謝所有

+0

使用的AsyncTask下載的圖像 –

+0

第一:我看到錯誤:的java.net.UnknownHostException:images.100bestbuy.com。它似乎你的網址有一些問題,試着訪問瀏覽器中的相同內容並檢查。其次:爲了更好的性能使用AsyncTask。 – vinaykumar

+0

感謝您的回覆。我正確的網址是http://images.100bestbuy.com/images/small_137385013870957.jpg – DJhon

回答

2

不建議您將整個圖像作爲blob存儲在您的sqlite數據庫中。而應將其下載到sd中的某個位置,然後將該路徑保存在sqlite數據庫的一列中。此外,android Cursor類中存在一個錯誤,它將無法正確處理大於1MB的圖像。見here。要下載從AsyncTask圖像,你可以使用這樣的事情:

public class MainActivity extends Activity { 
    protected SQLiteDatabase sqlitedatabase_obj; 
    DataBaseHelper databasehlpr_obj; 
    int accId; 
    byte[] accImage; 

    byte[] logoImage; 
    byte[] photo;@Override 

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    AndroidContext.setContext(this); 
    sqlitedatabase_obj = DataBaseHelper.getInstance().getDb(); 
    new ImageDownloader().execute("http://images.100bestbuy.com/images/small_137385013870957.jpg"); 


} 

private byte[] getLogoImage(String url) { 
    try { 
    URL imageUrl = new URL(url); 
    URLConnection ucon = imageUrl.openConnection(); 
    System.out.println("11111"); 
    InputStream is = ucon.getInputStream(); 
    System.out.println("12121"); 

    BufferedInputStream bis = new BufferedInputStream(is); 
    System.out.println("22222"); 

    ByteArrayBuffer baf = new ByteArrayBuffer(500); 
    int current = 0; 
    System.out.println("23333"); 

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

    } 
    photo = baf.toByteArray(); 
    System.out.println("photo length" + photo); 


} catch (Exception e) { 
    Log.d("ImageManager", "Error: " + e.toString()); 
} 
return accImage; 
} 
public void insertUser() { 
    ContentValues userdetailValues = new ContentValues(); 
    userdetailValues.put("account_image", photo); 
    sqlitedatabase_obj.insert(DataBaseHelper.IMG_table, null, userdetailValues); 
} 

private class ImageDownloader extends AsyncTask<String, Void, Void> { 

    private ProgressDialog progressDialog; 

    @Override 
    protected Void doInBackground(String... param) { 

     sqlitedatabase_obj.delete(DataBaseHelper.IMG_table, null, null); 
     logoImage = getLogoImage(param[0]); 

     insertUser(); 
    } 

    @Override 
    protected void onPreExecute() { 

     progressDialog = ProgressDialog.show(MainActivity.this, 
       "Wait", "Downloading Image"); 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     progressDialog.dismiss(); 

    } 

} 

} 
+0

感謝您的快速回復。是的,我知道所有這些東西,但在我的應用程序,我必須存儲非常小的圖像臨時使用,而不使用SD卡, – DJhon

+0

@BlueGreen我已經更新了我的答案。希望這有助於:) – Angelo

+0

請給我完整的項目@Angelo –

相關問題