在Android中将数据保存在数据库中

问题描述:

我正在尝试从SQLite数据库中的Android手机保存图像。下面是代码:在Android中将数据保存在数据库中

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera c) { 
      currentPictureName = Utils.getUserName(getApplicationContext()) 
        + System.currentTimeMillis() + ".jpg"; 

      DBHelper helper = new DBHelper(getApplicationContext()); 
      SQLiteDatabase db = helper.getReadableDatabase(); 
      ContentValues values = new ContentValues(); 
      values.put("name", currentPictureName); 
      values.put("image", data); 
      //db.insert(DBHelper.TABLE_NAME, null, values); 
      DBHelper.insertDB(db, DBHelper.TABLE_NAME, null, values); 

      mCamera.startPreview(); 
     } 
    }; 

DBHelper.java

package com.apps.terrapin; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBHelper extends SQLiteOpenHelper { 
    private static Context mContext; 
    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "terrapin"; 
    public static final String TABLE_NAME = "images"; 
    private static final String TABLE_CREATE = 
       "CREATE TABLE " + TABLE_NAME + " (" + 
       "_id INTEGER PRIMARY KEY, name TEXT, image BLOB);"; 

    DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mContext = context; 
    } 

    public static void insertDB(final SQLiteDatabase db, String tableName, String hack, final ContentValues values) { 
     Log.e("TAG", "Insert DB"); 
     new Thread(new Runnable() { 
      public void run() { 
       db.insert(DBHelper.TABLE_NAME, null, values); 
      } 
     }).start(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.e("TAG", "Creating DB"); 
     db.execSQL(TABLE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion >= newVersion) 
      return; 

     onCreate(db);  
    } 
} 

的问题是,我的应用程序正确地将图像保存了几次,然后当我点击保存图像按钮,它挂起。然后,Android要求我强制关闭它。我有正常的insert方法这个问题,所以我认为插入一个线程可能会有所帮助。但事实并非如此。这里有什么问题? logcat中不显示任何错误,有一个线,说

12-13 05:02:08.005: I/InputDispatcher(93): Application is not responding: 
Window{406d17f8 com.apps.terrapin/com.apps.terrapin.TerraPin paused=false}. 
10013.7ms since event, 10012.2ms since wait started 

我使用API​​级10

+0

您需要将图像存储为android中的BLOB, – Abhi

+0

是的,我将图像列定义为blob。函数调用不正确吗? –

+1

你错过了'insertDB()'中新线程的'start()'吗? – Karthik

小心,你的数据库基本上是在你的内部存储器,同时可以很容易地保存在外部存储图片。这样做会增加应用程序的大小......为什么不在数据库中保存文件的路径,并将其保存在内部存储器中?

+2

你给出的答案实际上不是一个回答。它应该被添加为注释。其次,数据库文件放在内存中没有限制。许多应用程序把数据库放在SD卡中。 –

+0

你说得对,我应该添加评论。但我是新的在Stackoverflow并没有足够的凭据来添加评论。我只能添加评论给我自己的答案。 – castrogne