在我的Android应用程序中,用户可以插入他/她的数据(姓名,年龄等)以及图像作为个人资料图片。插入数据后用户点击保存按钮。然后插入的数据将保存在数据库中。在数据库配置文件图片中有blob类型。
我还需要从数据库中检索用户名和个人资料图片,并以表格布局显示它们。
这是我将数据插入数据库的代码段。
case R.id.btnSave:
personName = etName.getText().toString();
date_of_birth = tvDOB.getText().toString();
age = tvAge.getText().toString();
int selected_rb_ID = genderGrp.getCheckedRadioButtonId();
RadioButton rb = (RadioButton) findViewById(selected_rb_ID);
gender = rb.getText().toString();
bloodGrp = spiBloodGrp.getSelectedItem().toString();
// get byte array from image view
Drawable d = image.getBackground();
BitmapDrawable bitDw = ((BitmapDrawable) d);
Bitmap bitmap = bitDw.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
Person person = new Person();
person.setName(personName);
person.setDate_of_birth(date_of_birth);
person.setAge(age);
person.setGender(gender);
person.setBloodGrp(bloodGrp);
String proPic = new String(imageInByte);
person.setProfilePic(proPic);
ContentValues values = new ContentValues();
//values.put(COLUMN_PROFILE_PICTURE, person.getProfilePic().toString());
values.put(COLUMN_PROFILE_PICTURE, person.getProfilePic());
values.put(COLUMN_PERSON_NAME, person.getName());
values.put(COLUMN_DOB, person.getDate_of_birth());
values.put(COLUMN_AGE, person.getAge());
values.put(COLUMN_GENDER, person.getGender());
values.put(COLUMN_BLOODGRP, person.getBloodGrp());
DBHelper dbHelper = new DBHelper(this);
dbHelper.openDataBase();
if(dbHelper.insertIntoDatabase("EMPerson", values)){
dbHelper.onUpgrade(myDatabase, 1, 2);
Toast.makeText(getApplicationContext(), "Your Data has been saved successfully", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "Oops ! Try again", Toast.LENGTH_SHORT).show();
}
dbHelper.closeDatabase();
这是我在表格布局中显示数据的代码段。
personList = helper.getPersonList();
loadTableLayouts();
这是我的loadTableLayouts()方法。
private void loadTableLayouts() {
int thheight = (int) (getResources().getDimension(R.dimen.cellLpH) / getResources()
.getDisplayMetrics().density);
int texthead = (int) (getResources().getDimension(R.dimen.boldtext) / getResources()
.getDisplayMetrics().density);
TableRow.LayoutParams rowLp = new TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT, thheight, 1.0f);
TableRow.LayoutParams cellLp = new TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT, thheight, 1.0f);
TableRow th = new TableRow(this);
th.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.FILL_PARENT));
TextView thPersonName = new TextView(this);
thPersonName.setTextSize(texthead);
thPersonName.setTextColor(Color.RED);
thPersonName.setText("Name");
thPersonName.setTypeface(null, Typeface.BOLD);
thPersonName.setPadding(10, 0, 12, 0);
th.addView(thPersonName, cellLp);
TextView thProPic = new TextView(this);
thProPic.setTextSize(texthead);
thProPic.setTextColor(Color.RED);
thProPic.setText("Profile Picture");
thProPic.setTypeface(null, Typeface.BOLD);
thProPic.setPadding(10, 0, 12, 0);
th.addView(thProPic, cellLp);
tblPerson.addView(th, rowLp);
if (personList.size() > 0) {
for (int i = 0; i < personList.size(); i++) {
final TableRow tr = new TableRow(this);
tr.setTag(i);
tr.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.FILL_PARENT));
final TextView txtPersonName = new TextView(this);
txtPersonName.setTextSize(1, 12);
txtPersonName.setTextColor(Color.BLACK);
txtPersonName.setText("" + personList.get(i).getName());
txtPersonName.setPadding(10, 0, 12, 0);
tr.addView(txtPersonName, cellLp);
final ImageView imgPic = new ImageView(this);
imgPic.setImageBitmap(convertByteArrayToBitmap(personList
.get(i).getProfilePic().getBytes()));
imgPic.setPadding(10, 0, 12, 0);
tr.addView(imgPic, cellLp);
tr.setBackgroundDrawable(getResources().getDrawable(
R.drawable.table_row_selector));
tr.setVisibility(View.VISIBLE);
tblPerson.addView(tr, rowLp);
}
}
}
我使用convertByteArrayToBitmap()方法从字节数组中检索图像。
// Retrieve image from byte array:
public static Bitmap convertByteArrayToBitmap(
byte[] byteArrayToBeCOnvertedIntoBitMap) {
Bitmap bitMapImage = BitmapFactory.decodeByteArray(
byteArrayToBeCOnvertedIntoBitMap, 0,
byteArrayToBeCOnvertedIntoBitMap.length);
return bitMapImage;
}
这是我的getPersonList()方法。
public ArrayList<Person> getPersonList() {
ArrayList<Person> personList = new ArrayList<Person>();
String sql = "SELECT p.PersonName, p.ProfilePicture "
+ "FROM EMPerson p " + "ORDER BY p.PersonName";
System.out.println(sql);
ArrayList<?> stringList = selectRecordsFromDB(sql, null);
for (int i = 0; i < stringList.size(); i++) {
ArrayList<?> arrayList = (ArrayList<?>) stringList.get(i);
ArrayList<?> list = arrayList;
Person person = new Person();
person.setName((String) list.get(0));
person.setProfilePic((String) list.get(1));
personList.add(person);
}
return personList;
}
这是我的实体类代码段。
public class Person {
private String profilePic;
private String name, date_of_birth, age, gender, bloodGrp;
public String getProfilePic() {
return profilePic;
}
public void setProfilePic(String imageInByte) {
this.profilePic = imageInByte;
}
public String getName() {
return name;
}
.........
问题是这会在运行时显示表格布局,但它只显示用户名。它没有显示个人资料图片。个人资料图片为空。即使log cat没有显示任何错误消息。
如果有人愿意解释这里发生的事情以及如何解决这个问题,我将非常感激。
干杯
答案 0 :(得分:0)
Android / Java String无法容纳大量输入流。
如果将ImageStream添加到String,它可能无法处理它。
您可以直接将其转换为位图,而不是转换为字符串,并将其设置为imageview。
考虑内存优化和性能问题,将图像数据保存在数据库中是不正确的。
直接将其保存在SDCard上或对其进行编码,并将该URL保存在数据库中。 按照需要动态地恢复图像。
答案 1 :(得分:0)
我建议你使用Base64.class将Image转换为String并保存在DataBase Column中。并在显示时获取图像字符串并转换为图像。
Bitmap bmp = your_bmap_obj;
OutputStream stream = new FileOutputStream("/sdcard/test.jpg");
bmp.compress(CompressFormat.JPEG, 100, stream);
使用此方法将图像转换为字符串
public static String getImageString(String filePath) {
String imageString = "";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);
bmp = Bitmap.createScaledBitmap(bmp, reqWidth, reqHeight, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 70, baos); // bm is the bitmap
// object
byte[] byte_arr = baos.toByteArray();
imageString = Base64.encodeBytes(byte_arr);
return imageString;
}