如何存储在数据库中的机器人的图像 [英] How to store an image in the database android
问题描述
我是新来的Android和我创建一个联络经理。我曾如何从的EditText字段中的值存储到数据库,但我不知道如何存储的图像在数据库中。我想知道,如果有人可以帮助我。
I am new to android and I am creating a contact manager. I have worked out how to store the values from EditText fields into the database but I don't know how to store an image in the database. I was wondering if someone could help me with this.
package awad865.project.ContactManager1;
import java.io.FileNotFoundException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.SQLException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
public class AddContact extends Activity {
//declare private fields
private EditText firstName;
private EditText lastName;
private EditText number;
private EditText address;
private EditText date;
private EditText email;
private Spinner numberSpinner;
private Spinner emailSpinner;
private Spinner addressSpinner;
private Spinner dateSpinner;
private DatabaseHandler databaseHandler;
private ImageButton addPic;
private final int IMAGE_SELECTION =1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
//code that enables the title on the action bar
getActionBar().setDisplayShowTitleEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);
databaseHandler = new DatabaseHandler(this);
//intialise private fields
firstName = (EditText)findViewById(R.id.edit_first_name);
lastName = (EditText)findViewById(R.id.edit_last_name);
number = (EditText)findViewById(R.id.edit_number);
address = (EditText)findViewById(R.id.edit_address);
date = (EditText)findViewById(R.id.edit_date);
email =(EditText)findViewById(R.id.edit_email);
//Spinner for the phone number field
numberSpinner = (Spinner) findViewById(R.id.contact_number_spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.number_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
numberSpinner.setAdapter(adapter);
//Spinner for the email address field
emailSpinner = (Spinner) findViewById(R.id.contact_email_spinner);
adapter = ArrayAdapter.createFromResource(this,
R.array.email_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
emailSpinner.setAdapter(adapter);
//Spinner for address field
addressSpinner = (Spinner) findViewById(R.id.contact_address_spinner);
adapter= ArrayAdapter.createFromResource(this,
R.array.address_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
addressSpinner.setAdapter(adapter);
//Spinner for date
dateSpinner = (Spinner) findViewById(R.id.contact_date_spinner);
adapter=ArrayAdapter.createFromResource(this,
R.array.date_array, android.R.layout.simple_spinner_dropdown_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
dateSpinner.setAdapter(adapter);
addPic = (ImageButton) findViewById(R.id.addImage);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.contacts_photo);
addPic.setImageBitmap(bm);
addPic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent imageIntent = new Intent(Intent.ACTION_PICK);
imageIntent.setType("image/*");
startActivityForResult(imageIntent, IMAGE_SELECTION);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode){
case IMAGE_SELECTION:
if(resultCode == RESULT_OK){
try{
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = true;
final Uri imageURI = imageReturnedIntent.getData();
final InputStream inStr = getContentResolver().openInputStream(imageURI);
final Bitmap selectImg = BitmapFactory.decodeStream(inStr, null, options);
addPic.setImageBitmap(selectImg);
}catch(FileNotFoundException ex){
Log.e("File not found", "Selected image was not found", ex);
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.add_contact, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
//if the save button is pressed, then all the information is retrieved from the EditText fields
//and stored in the private fields and then a new contact object is created and added to the
//database
case R.id.action_save:
//WANT to save the image here
BitmapDrawable bmd = ((BitmapDrawable) addPic.getDrawable());
Bitmap photo = bmd.getBitmap();
Contact contact = new Contact(firstName.getText().toString(),lastName.getText().toString(),number.getText().toString(), numberSpinner.getSelectedItem().toString(), email.getText().toString(), emailSpinner.getSelectedItem().toString(), date.getText().toString(), dateSpinner.getSelectedItem().toString(), address.getText().toString(), addressSpinner.getSelectedItem().toString(), "false");
//add to database
try {
databaseHandler.openDataBase();
databaseHandler.addContact(contact);
databaseHandler.close();
} catch (SQLException sqle) {
throw sqle;
}
//go back to list of contacts
Intent intentMain = new Intent(getApplicationContext(),MainActivity.class);
intentMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intentMain);
return true;
//if the cancel button is pressed on the action bar then the user is navigate to MainActivity
case R.id.action_cancel:
Intent intentCancel = new Intent(this,MainActivity.class);
intentCancel.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intentCancel);
return true;
//if the up button is pressed, then the user is taken back to the MainActivity
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
我的数据库处理器类:
My DatabaseHandler class:
package awad865.project.ContactManager1;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.util.ByteArrayBuffer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.util.Log;
public class DatabaseHandler extends SQLiteOpenHelper {
//declaring contants
private static String DB_NAME = "ContactsDb";
private static final int DB_VERSION = 1;
private static String DB_PATH = "/data/data/awad865.project.ContactManager1/databases/";
private final Context myContext;
private SQLiteDatabase myDataBase;
private static final String TABLE_CONTACT = "Contact";
private static final String FIRST_NAME = "firstname";
private static final String LAST_NAME = "lastname";
private static final String NUMBER = "number";
private static final String NUMBER_TYPE = "numbertype";
private static final String EMAIL = "email";
private static final String EMAIL_TYPE = "emailtype";
private static final String DATE = "date";
private static final String DATE_TYPE = "datetype";
private static final String ADDRESS = "address";
private static final String ADDRESS_TYPE = "addresstype";
private static final String IMAGE = "image";
private static final String FAVOURITE = "favourite";
//the parent constructor is called
public DatabaseHandler(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
}
//method for creating the database
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//copyDataBase();
}else{
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException{
//Open your local database as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty database
String outFileName = DB_PATH + DB_NAME;
//Open the empty database as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
//method for adding a contact to the database
public void addContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
//put all the appropriate edit text fields contact and store them in the database.
values.put(FIRST_NAME, contact.getFirstName());
values.put(LAST_NAME, contact.getLastName());
values.put(NUMBER, contact.getNumber());
values.put(NUMBER_TYPE, contact.getNumberType());
values.put(EMAIL, contact.getEmail());
values.put(EMAIL_TYPE, contact.getEmailType());
values.put(ADDRESS, contact.getAddress());
values.put(ADDRESS_TYPE, contact.getAddressType());
values.put(DATE, contact.getDate());
values.put(DATE_TYPE, contact.getDateType());
values.put(FAVOURITE, "false");
db.insert(TABLE_CONTACT, null, values);
db.close(); // Closing database connection
}
// Deleting single contact
public void deleteContact(String firstName, String lastName) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACT,
FIRST_NAME + "=? AND " + LAST_NAME + "=?",
new String[] {firstName, lastName});
db.close();
}
//this method is used for editing a contact
public int updateContact(Contact contact, String firstName, String lastName) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
//we first find the existing contact, and overwrite the old
//values with the new values
values.put(FIRST_NAME, contact.getFirstName());
values.put(LAST_NAME, contact.getLastName());
values.put(NUMBER, contact.getNumber());
values.put(NUMBER_TYPE, contact.getNumberType());
values.put(EMAIL, contact.getEmail());
values.put(EMAIL_TYPE, contact.getEmailType());
values.put(ADDRESS, contact.getAddress());
values.put(ADDRESS_TYPE, contact.getAddressType());
values.put(DATE, contact.getDate());
values.put(DATE_TYPE, contact.getDateType());
values.put(FAVOURITE, contact.getFavourite());
// updating row
return db.update(TABLE_CONTACT, values, FIRST_NAME + "=? AND " + LAST_NAME + "=?",
new String[] {firstName, lastName});
}
public List<Contact> getFavouriteContacts() {
List<Contact> contactList = new ArrayList<Contact>();
String isFavourite = "true";
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_CONTACT + " WHERE " + FAVOURITE + "='" + isFavourite + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact(cursor.getString(0),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(11));
// Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList;
}
public Contact getContact(String firstName, String lastName) {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_CONTACT + " WHERE " + FIRST_NAME + "='" + firstName + "' AND " + LAST_NAME + "='" + lastName + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact(cursor.getString(0),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(11));
// Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList.get(0);
}
public List<Contact> getContacts(String order) {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query
//this bottom line is used to change the sorting order of the contact list
String selectQuery = "SELECT * FROM " + TABLE_CONTACT +" ORDER BY " + order;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact(cursor.getString(0),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5),cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(11));
// Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList;
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
任何帮助将是AP preciated。在此先感谢!
Any help would be appreciated. Thanks in advance!
推荐答案
最可能的是,你可以在你的数据库使用BLOB,将图像转换为字节数组,并存储在数据库中。
Most probably you could use BLOB in you database, convert the image to byte array and store in database.
您也可以参考以下链接获得有关它的公平和清晰的思路:
You can also refer the following links to get a fair and clear idea about it:
<一个href="http://stackoverflow.com/questions/7331310/how-to-store-image-as-blob-in-sqlite-how-to-retrieve-it">how存储图像的BLOB SQLite中和放大器;如何找回?
<一个href="http://stackoverflow.com/questions/10831151/how-to-store-and-retrieve-images-in-android-sqlite-database-and-display-them-on">how存储和检索的Android SQLite数据库的图像和一个GridView 显示出来。
<一个href="http://stackoverflow.com/questions/13840504/how-to-save-and-retrive-images-from-sql-lite-database-in-android">how保存和android的 retrive从SQL精简版数据库中的图像
how to save and retrive images from sql lite database in android
<一个href="http://stackoverflow.com/questions/9941637/android-how-to-save-camera-images-in-database-and-display-another-activity-in-li">Android如何将照相机图像保存在数据库中,并在列表视图中显示其他的活动?
这篇关于如何存储在数据库中的机器人的图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!