반응형
Sqlite에서 이미지를 blob으로 저장하는 방법 및 검색 방법?
이미지 (URL에서)를 sqlite 데이터베이스에 저장하고 싶습니다.
이를 위해 다음을 사용합니다.
db = new DataBase(getApplicationContext());
URL url = new URL("http://sree.cc/wp-content/uploads/schogini_team.png");
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is,128);
ByteArrayBuffer barb= new ByteArrayBuffer(128);
int current = 0;
while ((current = bis.read()) != -1) {
barb.append((byte) current);
}
ContentValues filedata= new ContentValues();
filedata.put(DataBase.IMG_SRC,barb.toByteArray());
db.insert(DataBase.Table_Img, null, filedata);
에서 Insert()
:
public void insert(String tableImg, Object object,
ContentValues dataToInsert) {
// TODO Auto-generated method stub
String sql = "INSERT INTO "+tableImg+" ("+ID+","+IMG_SRC+") " +
"VALUES ('"+1+"','"+dataToInsert+"')";
db.execSQL(sql);
}
이미지 검색 :
Cursor cursor = db.selectDataToShow(DataBase.Table_Img, DataBase.IMG_SRC);
byte[] imageByteArray=cursor.getBlob(cursor.getColumnIndex(DataBase.IMG_SRC));
cursor.close();
ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByteArray);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);
System.out.println(">>>>>>>>>>>>>>>>>>>>>> "+theImage);
그래서 여기에 null
.
그리고 내 데이터베이스에서 이미지의 값은 다음과 같이 저장됩니다. Image=[B@43e5ac48]
여기 내 앱에 사용한 코드
이 코드는 URL에서 이미지를 가져와 바이트 배열로 변환합니다.
byte[] logoImage = getLogoImage(IMAGEURL);
private byte[] getLogoImage(String url){
try {
URL imageUrl = new URL(url);
URLConnection ucon = imageUrl.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(500);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
return baf.toByteArray();
} catch (Exception e) {
Log.d("ImageManager", "Error: " + e.toString());
}
return null;
}
이미지를 db에 저장하려면이 코드를 사용했습니다.
public void insertUser(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String delSql = "DELETE FROM ACCOUNTS";
SQLiteStatement delStmt = db.compileStatement(delSql);
delStmt.execute();
String sql = "INSERT INTO ACCOUNTS (account_id,account_name,account_image) VALUES(?,?,?)";
SQLiteStatement insertStmt = db.compileStatement(sql);
insertStmt.clearBindings();
insertStmt.bindString(1, Integer.toString(this.accId));
insertStmt.bindString(2,this.accName);
insertStmt.bindBlob(3, this.accImage);
insertStmt.executeInsert();
db.close();
}
이미지를 다시 검색하기 위해 이것은 내가 사용한 코드입니다.
public Account getCurrentAccount() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "SELECT * FROM ACCOUNTS";
Cursor cursor = db.rawQuery(sql, new String[] {});
if(cursor.moveToFirst()){
this.accId = cursor.getInt(0);
this.accName = cursor.getString(1);
this.accImage = cursor.getBlob(2);
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
db.close();
if(cursor.getCount() == 0){
return null;
} else {
return this;
}
}
마지막으로이 이미지를 imageview에로드하려면
logoImage.setImageBitmap(BitmapFactory.decodeByteArray( currentAccount.accImage,
0,currentAccount.accImage.length));
DBAdaper 즉 데이터베이스 도우미 클래스에서 다음과 같이 테이블을 선언합니다.
private static final String USERDETAILS=
"create table userdetails(usersno integer primary key autoincrement,userid text not null ,username text not null,password text not null,photo BLOB,visibility text not null);";
다음과 같은 값을 삽입하고
먼저 이미지를 byte []로 변환합니다.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] photo = baos.toByteArray();
db.insertUserDetails(value1,value2, value3, photo,value2);
DEAdaper 클래스
public long insertUserDetails(String uname,String userid, String pass, byte[] photo,String visibility)
{
ContentValues initialValues = new ContentValues();
initialValues.put("username", uname);
initialValues.put("userid",userid);
initialValues.put("password", pass);
initialValues.put("photo",photo);
initialValues.put("visibility",visibility);
return db.insert("userdetails", null, initialValues);
}
다음과 같이 이미지 검색
Cursor cur=your query;
while(cur.moveToNext())
{
byte[] photo=cur.getBlob(index of blob cloumn);
}
byte []를 이미지로 변환
ByteArrayInputStream imageStream = new ByteArrayInputStream(photo);
Bitmap theImage= BitmapFactory.decodeStream(imageStream);
이 콘텐츠가 문제를 해결할 수 있다고 생각합니다.
insert ()에서
public void insert(String tableImg, Object object,
ContentValues dataToInsert) {
db.insert(tablename, null, dataToInsert);
}
도움이되기를 바랍니다.
이온 프로젝트를 위해
var imgURI = ""; var imgBBDD = ""; //sqllite for save into function takepicture() { var options = { quality : 75, destinationType : Camera.DestinationType.DATA_URL, sourceType : Camera.PictureSourceType.CAMERA, allowEdit : true, encodingType: Camera.EncodingType.JPEG, targetWidth: 300, targetHeight: 300, popoverOptions: CameraPopoverOptions, saveToPhotoAlbum: false }; $cordovaCamera.getPicture(options).then(function(imageData) { imgURI = "data:image/jpeg;base64," + imageData; imgBBDD = imageData; }, function(err) { // An error occured. Show a message to the user }); }
And now we put imgBBDD into SqlLite
function saveImage = function (theId, theimage){ var insertQuery = "INSERT INTO images(id, image) VALUES("+theId+", '"+theimage+"');" console.log('>>>>>>>'); DDBB.SelectQuery(insertQuery) .then( function(result) { console.log("Image saved"); }) .catch( function(err) { deferred.resolve(err); return cb(err); }); }
A server side (php)
$request = file_get_contents("php://input"); // gets the raw data $dades = json_decode($request,true); // true for return as array if($dades==""){ $array = array(); $array['error'] = -1; $array['descError'] = "Error when get the file"; $array['logError'] = ''; echo json_encode($array); exit; } //send the image again to the client header('Content-Type: image/jpeg'); echo '';
byte[] byteArray = rs.getBytes("columnname");
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length);
you may also want to encode and decode to/from base64
function uncompress(str:String):ByteArray {
import mx.utils.Base64Decoder;
var dec:Base64Decoder = new Base64Decoder();
dec.decode(str);
var newByteArr:ByteArray=dec.toByteArray();
return newByteArr;
}
// Compress a ByteArray into a Base64 String.
function compress(bytes:ByteArray):String {
import mx.utils.Base64Decoder; //Transform String in a ByteArray.
import mx.utils.Base64Encoder; //Transform ByteArray in a readable string.
var enc:Base64Encoder = new Base64Encoder();
enc.encodeBytes(bytes);
return enc.drain().split("\n").join("");
}
참고URL : https://stackoverflow.com/questions/7331310/how-to-store-image-as-blob-in-sqlite-how-to-retrieve-it
반응형
'IT TIP' 카테고리의 다른 글
{before _,} {install, script} .travis.yml 옵션의 차이점은 무엇입니까? (0) | 2020.10.24 |
---|---|
데이터베이스에 업무 시간 저장 (0) | 2020.10.24 |
로그인 (인증) 요청에는 어떤 방법을 사용해야합니까? (0) | 2020.10.24 |
offsetTop 대 jQuery.offset (). top (0) | 2020.10.24 |
S3에서 파일 이름의 최대 길이는 얼마입니까? (0) | 2020.10.24 |