Java 在SQLITE数据库中保存图像时发生OutOfMemoryError
我在sqlite数据库中保存图像时遇到了这个错误,图像大小只有240KB。我已经通过了一些解决方案,但无法解决这个问题。我在DB中保存和获取图像的代码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
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