关于在SQliteDatabase

时间:2016-09-07 06:35:54

标签: 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 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)

2 个答案:

答案 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

相关问题