2016-09-07 76 views
1

IM而在SQLite数据库保存图像面对这个错误,图像大小只有240KB我已经通过了一些解决方案了,但没能解决这个问题,我的代码为DB的OutOfMemoryError在SQliteDatabase保存图像

public class MainActivity extends AppCompatActivity { 

SQLiteDatabase db; 
ImageView img,img_get; 
Button btn_save,btn_get; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    img=(ImageView)findViewById(R.id.img_save); 
    img_get=(ImageView)findViewById(R.id.img_get); 
    btn_get=(Button)findViewById(R.id.btn_get); 
    btn_save=(Button)findViewById(R.id.btn_save); 
    db= openOrCreateDatabase("Mydb", MODE_PRIVATE, null); 
    db.execSQL("create table if not exists hello(name varchar, a blob)"); 


    btn_save.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
     saveimage(v); 

     } 
    }); 

    btn_get.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      getimage(v); 
     } 
    }); 
} 
public void saveimage(View view) 
{ 
    byte[] image=new byte[R.drawable.red]; 
    ContentValues value=new ContentValues(); 
    value.put("name","hatib abrar"); 
    value.put("a",image); 
    db.insert("hello",null,value); 
    Toast.makeText(getApplicationContext(),"Saved",Toast.LENGTH_SHORT).show(); 
} 
public void getimage(View view) 
{ 
    Cursor c=db.rawQuery("select * from hello",null); 
    if (c.moveToNext()) 
    { 
     String name=c.getString(0); 
     byte[] image=c.getBlob(1); 
     Bitmap bm= BitmapFactory.decodeByteArray(image,0,image.length); 
     img_get.setImageBitmap(bm); 
     Toast.makeText(getApplicationContext(),"Error getting image",Toast.LENGTH_SHORT).show(); 
    } 

} 
保存和获取图像

logcat的是显示这个错误 投掷

OutOfMemoryError "Failed to allocate a 2130837597 byte allocation with 16777216 free bytes and 151MB until OOM" 09-07 09:49:59.651 21823-21823/com.example.e6530.imagesaving D/AndroidRuntime: Shutting down VM 09-07 09:49:59.651 21823-21823/com.example.e6530.imagesaving E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.e6530.imagesaving, PID: 21823 java.lang.OutOfMemoryError: Failed to allocate a 2130837597 byte allocation with 16777216 free bytes and 151MB until OOM at com.example.e6530.imagesaving.MainActivity.saveimage(MainActivity.java:51) at com.example.e6530.imagesaving.MainActivity$1.onClick(MainActivity.java:36) at android.view.View.performClick(View.java:4793) at android.view.View$PerformClick.run(View.java:19971) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5669) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

+0

你为什么不把图像保存在SD卡或其他东西?在数据库中存储图像是不好的做法,相反,您可以将路径存储在分贝中,实际图像可以存储在SD卡中。 – himanshu1496

+0

生成的位图大小不取决于图像的大小。它取决于该图像的分辨率 – Prashant

+0

大图像???? –

回答

2

您的问题是在这条线:

byte[] image=new byte[R.drawable.red]; 

经常R.drawable是一个大整数。例如10亿,所以你尝试创建数十亿字节的数组。这是很多的记忆。请不要将资源ID作为数组大小传递。

更新

请参阅this答案,this的页面来处理如何从资源获取位图,并将其转换为字节数组。也许你需要写类似:

Resource r = ...; 
Bitmap bitmap = Bitmap.decodeResource(r, R.drawable.red); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitmapdata = stream.toByteArray(); 
+0

是的,我认为这个问题是与这如何分配图像的字节? m测试这个模块,因为我必须从列表中取出youtube视频的缩略图并将其存储到sqlite数据库 –

+0

@hatibabrar更新了我的答案 –

+0

让我检查这个bro –

2

此:

byte[] image=new byte[R.drawable.red]; 

没有做什么,你认为它。 R.drawable.red是生成的整数ID,可能相当高。在你的情况下,像2130837597,这是你尝试分配的字节量。

你必须先加载你的图像,然后得到它的字节并将它们加载到你的数据库中。快速搜索出现this for example

+0

让我检查兄弟这是的,你是对的它显示我的大数我无法得到它 –

+0

感谢兄弟为了得到我的问题工作就像一个魅力:) –