在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
小心,你的数据库基本上是在你的内部存储器,同时可以很容易地保存在外部存储图片。这样做会增加应用程序的大小......为什么不在数据库中保存文件的路径,并将其保存在内部存储器中?
你给出的答案实际上不是一个回答。它应该被添加为注释。其次,数据库文件放在内存中没有限制。许多应用程序把数据库放在SD卡中。 –
你说得对,我应该添加评论。但我是新的在Stackoverflow并没有足够的凭据来添加评论。我只能添加评论给我自己的答案。 – castrogne
您需要将图像存储为android中的BLOB, – Abhi
是的,我将图像列定义为blob。函数调用不正确吗? –
你错过了'insertDB()'中新线程的'start()'吗? – Karthik