Java 在SQLITE数据库中保存图像时发生OutOfMemoryError

Java 在SQLITE数据库中保存图像时发生OutOfMemoryError,java,android,sqlite,Java,Android,Sqlite,我在sqlite数据库中保存图像时遇到了这个错误,图像大小只有240KB。我已经通过了一些解决方案,但无法解决这个问题。我在DB中保存和获取图像的代码 public class MainActivity extends AppCompatActivity { SQLiteDatabase db; ImageView img,img_get; Button btn_save,btn_get; @Override protected void onCreate(Bundle savedInstan

我在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.65121823-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) 位于java.lang.reflect.Method.invoke(本机方法) 位于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)


您的问题在这一行:

byte[] image=new byte[R.drawable.red];
通常R.drawable是一个大整数。例如,10亿字节,所以您尝试创建10亿字节的数组。这是一个很大的记忆。请不要将资源id作为数组大小传递

已更新

请参阅答案和页面,了解如何从资源中检索位图并将其转换为字节数组。也许你需要写一些东西,比如:

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();

您的问题在这一行:

byte[] image=new byte[R.drawable.red];
通常R.drawable是一个大整数。例如,10亿字节,所以您尝试创建10亿字节的数组。这是一个很大的记忆。请不要将资源id作为数组大小传递

已更新

请参阅答案和页面,了解如何从资源中检索位图并将其转换为字节数组。也许你需要写一些东西,比如:

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();
这:

不会做你认为它会做的事
R.drawable.red
是一个生成的整数ID,可以非常高。在您的例子中,类似2130837597的内容,这是您尝试分配的字节数

您必须首先加载图像,然后获取其字节并将其加载到数据库中。快速搜索会出现以下内容。

byte[] image=new byte[R.drawable.red];
不会做你认为它会做的事
R.drawable.red
是一个生成的整数ID,可以非常高。在您的例子中,类似2130837597的内容,这是您尝试分配的字节数



您必须首先加载图像,然后获取其字节并将其加载到数据库中。快速搜索出来。

为什么不将图像保存在SD卡或其他东西中?将图像存储在数据库中是不好的做法,相反,您可以将路径存储在db中,而实际图像可以存储在sd卡中。生成的位图大小不取决于图像的大小。这取决于图像的分辨率大图像???@IntelliJAmiya图像大小仅为220kb检查以下答案。逻辑完美。你为什么不把你的图像保存在SD卡之类的东西里呢?将图像存储在数据库中是不好的做法,相反,您可以将路径存储在db中,而实际图像可以存储在sd卡中。生成的位图大小不取决于图像的大小。这取决于图像的分辨率大图像???@IntelliJAmiya图像大小仅为220kb检查以下答案。逻辑完美。让我检查一下兄弟这个是的,你是对的,它向我显示了一个大数字,我找不到它Hanks bro的帮助让我的问题像个符咒一样工作:)让我检查一下兄弟这个是的,你是对的,它向我显示了一个大数字,我找不到它Hanks bro的帮助让我的问题像个符咒一样工作:)是的,我认为问题是如何将图像分配给字节?我正在测试这个模块,因为我必须从列表中获取youtube视频的缩略图并将其存储到sqlite数据库让我检查一下这个broyes我认为问题在于这个,我应该如何将图像分配到字节?我正在测试这个模块,因为我必须从列表中获取youtube视频的缩略图并将其存储到sqlite数据库让我检查一下这个bro