我在sqlite数据库中保存图像时遇到此错误,图像大小仅为240KB我已经通过一些解决方案但无法解决此问题我的代码用于保存并在DB中获取图像
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“无法分配2130837597字节 分配16777216个空闲字节和151MB直到OOM“09-07 09:49:59.651 21823-21823 / com.example.e6530.imagesaving D / AndroidRuntime:关闭VM 09-07 09:49:59.651 21823-21823 / com.example.e6530.imagesaving E / AndroidRuntime:致命 例外:主要 处理:com.example.e6530.imagesaving,PID:21823 java.lang.OutOfMemoryError:无法分配2130837597字节 分配16777216个空闲字节和151MB直到OOM 在 com.example.e6530.imagesaving.MainActivity.saveimage(MainActivity.java:51) 在 com.example.e6530.imagesaving.MainActivity $ 1.onClick(MainActivity.java:36) 在android.view.View.performClick(View.java:4793) 在android.view.View $ PerformClick.run(View.java:19971) 在android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5669) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:960) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
答案 0 :(得分:2)
你的问题在这一行:
byte[] image=new byte[R.drawable.red];
通常R.drawable是一个大整数。例如10亿,所以你尝试创建十亿字节的数组。这是很多记忆。请不要将资源ID作为数组的大小传递。
<强>更新强>
请参阅this answer和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();
答案 1 :(得分:2)
这:
byte[] image=new byte[R.drawable.red];
不符合您的想法。 R.drawable.red
是生成的整数ID,可能非常高。在你的情况下,像2130837597,这是你尝试分配的字节数。
您必须先加载图像,然后获取其字节并将其加载到数据库中。快速搜索this for example。